mysql调优的大致思路
1.定位到执行慢的sql语句
首先执行
show VARIABLES LIKE '%quer%'
可以得到
第一个表示慢日志是否开启,默认关闭,第二表示慢日志的文件的位置。
一般执行时间超过10秒的sql语句就会被放进这个文件里面(10秒是默认值,可以修改),这样就可以定位到执行慢的sql语句。
2.用explain分析执行慢的语句
运行
EXPLAIN UPDATE person_info_large_myisam SET account=account WHERE id BETWEEN 1 AND 200000
可以得到
每个字段的意思:
ID:表示查询中执行select子句或操作表的顺序,当id相同时,按从上到下的顺序执行,id不同时,id数值大的先执行。
select_type:select_type代表的是查询的类型,主要是用于区别普通查询,联合查询,子查询。
SIMPLE :简单的select查询,查询中不包含子查询或者UNION。
primary:查询中若包含任何的子查询,最外层查询则被标记为primary。
subquery:表示子查询。
dervied:zai from列表中包含的子查询标记为derived(衍生) mysql会递归执行浙西子查询,把结果放在临时表里。
UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVE
union result :从union表获取结果的select。
table:表示执行的表
type:type所显示的是查询使用了哪种类型…
这个字段很重要,从好到坏的顺序是:
system > const > eq_ref > ref > range > index > all
一般来说,至少要保证能达到range级别。
system:该类型表示表中只有一行记录
const:常量匹配,表示通过索引一次就可以找到数据
eq_ref:唯一性索引扫描,对于每个索引建,表中只有一条记录和它匹配
ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
range:只查找范围内的数据,使用索引来匹配行,查询的范围缩小了,自己比前面的类型性能更好
index:(full index scan)全索引文件扫描比all要好不少,将直接从索引数据结构中找寻数据,比全表扫描理论上快不少
all: Full Table Scan 将遍历全表以找到匹配的行
possible_keys: 显示可能应用在这张表中的索引,一个或多个,但不一定会使用到
keys:显示查询语句中实际使用的索引,如果没有使用则为null
key_len: 显示索引中使用的字节数,通过key_len计算查询中使用的索引长度,在不损失精确性的情况下索引长度越短越好,key_len显示的值为索引字段最可能的长度,并非是实际使用长度
ref:显示索引的那一列被使用了,如果可能的话,最好是一个常数。
**rows:**根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,越少越好
extra:包含十分重要的额外信息
Usiing filesort:说明mysql读数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql无法利用索引完成的排序称为"文件排序".
Using temporary:使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
Using index:表示相应的select操作中使用了覆盖索引,.
Using where : 表明使用了where过滤
Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些
impossible where:where子句的值总是false,不能用来获取任何元组
3.对对应的sql语句进行优化
通过一些提高性能的经验来修改sql语句,或者让sql走索引。