sql优化策略
下面的方法适用于数据量大的情况下sql不走索引,数据少的就没必要了,几千条数据完全没有必要建索引。
sql优化的精髓在于,能走索引绝不回表查询,尽量出现索引覆盖,避免全表扫描,能少查一个字段就少查一个,不要总是select *。
查询语句语法顺序
SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
如何避免sql不走索引
1.尽量不要在字段左边也就是字段开头模糊查询,会让数据库引擎不走索引直接全表扫描,但是可以在字段的后面使用模糊查询,如果一定要在前面使用可以使用MySQL内置的函数INSTR(str,substr) 来匹配。
ps: INSTR(str, substr):返回子串substr在字符串str中的第一个出现的位置,如果存在则返回1~N,不存在返回0,任意一个字符串为NULL则返回NULL。
2.能不用in和not in就不用,用了会导致全表扫描,可以用between代替。
3.能不用or就不用,用了会导致全表扫描,可以用between代替。可以用union代替。
4.尽量不要用null值当判断条件,用了会导致全表扫描,如果该值为空可以默认为0。
5.避免在where条件的左边使用运算符号,用了会导致数据库引擎放弃索引全表扫描(那左边÷10不就相当于右边*10吗,调个方向,他就走索引了)。
6.查询条件中尽量不使用不等于符号(<>,!=),用了会导致数据库引擎放弃索引全表扫描。
7.where的条件如果有复合索引,记得按照索引最左匹配原则进行摆放。
ps:最左匹配原则,我简单的形容一下,假设有a、b、c三个索引,只有a=xxx、b=xxx、c=xxx,a=xxx、b=xxx,a=xxx这三种情况才会走索引。
8.条件语句中进行类型转换会不使用索引。
例如:a字段是char类型,你像下面这么写sql,涉及隐式类型转换,那必然是不会走索引的。
select*from table where a=1;