SQL部分优化整理

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个字段全用上了,无论顺序如何,优化器会自动找出最优查询方法(复合索引顺序);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值