mysql优化怎么做 mysql 优化口诀( 四 )


3、分表分区 。
分表分区也是为了提高搜索速度 。例如,公交车的gps行驶记录,gps每隔15s报一次,一辆车一天运行12小时,一天就要插入4*60*12条记录,N辆车就要再乘,其数量极大,所以经常按月分表,分表里再按上报时间做日分区,这样就达到很大的优化,想查询某段时间 , mysql很快就可以定位到 。
4、表结构 。
表结构很重要,经常需要多表关联查询一些字段,有时可以冗余下放到同一张表 。
mysql优化很有意思,多去查阅些资料,多去尝试,对你有好处的 。
MySQL常用优化方案语句执行后,会显示三个字段: Query_ID(执行ID) | Duration(持续时间)| Query(查询语句) ;
拿到后Query_ID后,可执行 show profile for query Query_ID,查看详细的准备时间,执行时间、执行结束( preparing、executing、end )等 。
显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程 , 看不到其它用户正在运行的线程 。除非单独个这个用户赋予了PROCESS 权限 。
显示字段包含: User| Host| db | Command | Time| State| Info 等 。
解析语句,查询是否命中索引,及 , 命中何种索引,用以判断是否符合我们的预期 。
返回字段包含: select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra等 。
select_type常见类型:
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
table常见类型:
显示这一行的数据是关于哪张表的.
有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)
type常见类型:
对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型” 。
常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL (从左到右,性能从差到好)
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
该列完全独立于EXPLAIN输出所示的表的次序 。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用 。
如果该列是NULL,则没有相关的索引 。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能 。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
key
key列显示MySQL实际决定使用的键(索引) , 必然包含在possible_keys中
如果没有选择索引,键是NULL 。要想强制MySQL使用或忽视possible_keys列中的索引 , 在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX 。
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,非实际长度,为最大可能长度 。
注:不损失精确性的情况下 , 长度越短越好 。
ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 。
rows
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数;
extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
(1).Distinct

推荐阅读