SQL优化:
1.IN 和 DISTINCT尽量用EXISTS代替 NOT IN ——>左连接——>NOT EXISTS IN和EXISTS使用优先级,看数据量(一定要使用数据量大的表索引)
2.不需要的数据,尽量在连接前过滤掉,减少笛卡尔积
3.建立索引
4.使用存储过程
5.负向查询不使用索引:NOT,NOT IN,NOT LIKE ,<>,!=,!>,!<,IS NULL,NOT IS NULL
因为索引是告诉你,什么在数据表,并不是告诉你什么不在数据表中
6.OR(必须所有or的字段都是独立索引,新版本mysql InnoDB引擎也可以使用)
LIKE 后通配走索引,前通配走全表
7.使用函数的字段不走索引
适合/不适合建立索引的字段:
适合:1.经常在where 和 order by中出现的字段
2.主键,外键,连接字段
不适合:1.可以有NULL值的字段
2.大量数据重复的字段
3.经常使用函数的字段
4.经常用前通配符进行模糊查询的字段
5.超长字段
注意:能用单索引不要使用复合索引。只有复合索引中第一列被where使用后,此复合索引才会被使用,复合索引的字段顺序最好和where和order by中一致
【没有用到复合索引】这种说法是不准确的:复合索引最左原则举例
单一索引:name_INX
一个复合索引name_cid_sex_INX相当于建立了3个索引分别是:
(name),(name,cid),(name,cid,sex)
只有最左字段的查询:
select * from student where name='小红';
type===>ref key===>name_INX/name_cid_sex_INX
无数据的情况下:
有数据的情况下:
不包含最左字段的查询:
select * from student where cid=1;
select * from student where cid=1 and sex='1';
type===>index key===>name_cid_sex_INX
非复合字段所有字段,包含最左字段查询:
都用到了复合索引,type===>ref
col1+col2 == col2+col1
col1+col3 == col3+col1
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好(与字段有关)
包含复合索引的所有字段查询:
select * from student where name='小红' and cid=1 and sex='1';
select * from student where cid=1 and name='小红' and sex='1';
select * from student where sex='1' and cid=1 and name='小红' ;
where 语句中复合索引中3个字段全用上了,无论顺序如何,优化器会自动找出最优查询方法(复合索引顺序);