explain 可以查看sql语句的执行情况,可以看到每个条件扫描的行数,当系统内需要使用SQL查询时,通过explain看下该语句的性能。
1.索引通常被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。所以我们选择索引的列也通常选择出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。
2.数据列的不同的值越多,索引效果越好。如果一个数据列只包含:0或者1两个值的话,索引的用处就不大。
3.如果索引了多列,要遵守最左前缀法则。所谓最左前列,指的是查询从索引的最左前列开始,并且不跳过索引中的列。譬如对:t1,t2,t3建立联合索引的话,同时也是对t1和t1,t2建立了索引。但是如果单独指定t2、t3、t1t3、t2t3的值的话,都会用不到索引。
4.尽量比较数据类型相同的数据列。例如,INT与BIGINT是不同的。CHAR(10)被认为是CHAR(10)或VARCHAR(10),但是与CHAR(12)或VARCHAR(12)不同。
5.索引列不应该作为表达式的一部分,即也不能在索引列上使用函数。
6.在使用LIKE时,尽量不要在开头使用通配符
WHERE col_name LIKE ’%string%’
WHERE col_name LIKE ’abc%’
7.不要使用类型转换。如果某个索引列是int型,而在查询时,赋值为字符型,将使用不了索引。
SELECT * FROM mytbl WHERE num_col = 1;使用索引
SELECT * FROM mytbl WHERE num_col = ‘1’;没有使用索引
8.在SELECT语句中可以使用STRAIGHT_JOIN关键字来重载优化器的选择。left join时会选择结果集较小的表作为基准表,如果排序条件为另一张表的字段就有可能影响效率,STRAIGHT_JOIN可以指定顺序连接。
9.当MySQL一旦估计检查的行数可能会”太多”,范围查找优化将不会被使用。
10.尽量借用覆盖索引,减少select * from …语句使用;
11.ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序;
12.慎用left join语句,避免创建临时表 使用left join语句的时候,避免出现创建临时表。尽量不要用left join,分而治之。非要使用的时候,要询问自己是不是真要必须要使用。