建索引的条件
1.频繁作为查询条件的字段;
2.且辨识度较高的(唯一性);
3.增、删、改操作较多的字段不适合建索引;
4.多表关联的,关联字段(注意字段类型一致);
优化:
1.使用explain 帮助分析查询语句;
explain select * from ......
主要关注以下属性:
type:显示连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一;
Distinct一旦MYSQL找到了与行相联合匹配的行,就不再搜索了Not existsMYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了Range checked for eachRecord(index map:#)没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一Using filesort看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行Using index列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候Using temporary看到这个的时候,查询需要优化了。这 里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上Using where使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题
from tb
where FROM_UNIXTIME(create_time,'%Y-%m-%d')=UNIX_TIMESTAMP('2017-10-16')
or FROM_UNIXTIME(edit_time,'%Y-%m-%d')='2017-10-16'
from tb
where (create_time >= UNIX_TIMESTAMP('2017-10-16') AND create_time < UNIX_TIMESTAMP('2017-10-17'))
or (edit_time >= UNIX_TIMESTAMP('2017-10-16') AND edit_time < UNIX_TIMESTAMP('2017-10-17'))