MySQL优化总结
剩下的问题是,默认情况,MySQL假设在tt.ActualPC列的值是均匀分布的,并且对tt表不是这样。幸好,很容易告诉MySQL来分析关键字分布:
mysql> ANALYZE TABLE tt;
现在联接是“完美”的了,而且EXPLAIN产生这个结果:
table type possible_keys key key_len ref rows Extra
tt ALL AssignedPC NULL NULL NULL 3872 Using
ClientID, where
ActualPC
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
注意在从EXPLAIN输出的rows列是一个来自MySQL联接优化器的“教育猜测”。你应该检查数字是否接近事实。如果不是,可以通过在SELECT语句里面使用STRAIGHT_JOIN并且试着在FROM子句以不同的次序列出表,可能得到更好的性能。
我们需要特别注意的是key、Extra字段。Key字段显示用了哪个索引,注意看是不是用了索引,如果用了是不是效率最高的。Extra字段会说明是否用了临时表,是否用了基于磁盘的临时表,是否用了文件排序,是否用了全索引扫描,where是有数据库engine产生的还是由数据库server限制的。
1
第1页:数据库设计第2页:适当建立索引/对表进行水平划分第3页:对表进行垂直划分第4页:字段类型/文件系统/外键/表的写入时机第5页:避免频繁读写/选择合适的引擎第6页:SQL语句优化工具:慢日志和mysqldumpslow.pl第7页:SQL语句优化工具:Explain(1)第8页:SQL语句优化工具:Explain(2)第9页:SQL语句优化工具:Explain(3)第10页:SQL语句优化工具:Explain(4)第11页:SQL语句优化工具:Explain(5)第12页:SQL语句优化工具:Explain(6)第13页:SQL语句优化工具:Explain(7)第14页:SQL语句优化工具:Explain(8)第15页:SQL语句优化工具:Explain(9)第16页:SQL语句优化工具:Show [full] processlist(1)第17页:SQL语句优化工具:Show [full] processlist(2)第18页:SQL语句优化工具:Show [full] processlist(3)第19页:减少不必要的表关联第20页:尽可能的限制条件第21页:过大的子查询用临时表处理效果会好的多第22页:Join Vs select 结果集作列第23页:全索引扫描第24页:Join、In、not in、exist、not exist并不是绝对的/Like第25页:数据库参数配置第26页:合理的硬件资源和操作系统/读写分离
相关文章