mysql索引优化_MySQL索引优化

一、单表

创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序)

5f8858ebf39acd2d2e55603ee69b5917.png

根据where后面的条件创建:CREATE INDEX idx_article_ccv ON article(category_id,comments,views);

f7f6558d926b6fc7cb71b658266291c0.png

可以看出type由ALL变成了range,但是Extra里面的Using filesort(文件内部排序)未解决

此时删除索引:DROP INDEX idx_article_ccv ON article;

重新建立:CREATE INDEX idx_article_ccv ON article(category_id,views);

de513a6b2427de5bf4c012d83535cf55.png

此时完美解决!!

二、双表

创建索引之前:type=ALL全表扫描

dd8b3348808cde630b68258aae7cfc50.png

此时有两个表,里面都有字段card,但是现在不知道应该建左表class还是右表book,所以可以先建右表book,查看之后再进行优化

ALTER TABLE book ADD index  Y('card');

6db9a5a6c611f896ecfc67501fc057b7.png

此时可以明显看到book表得到优化type=ref,但是class表未得到改变,于是删除索引:DROP INDEX Y ON book;

现在加左表class:ALTER TABLE class ADD INDEX Y ('card');

7884c60f88f90db9525b83f64a560ff5.png

此时看到class表的type=index,建立在右表type=ref,因为ref>index,rows=40>前者的21,所以权衡之间,得到:

左右连接时,左连接建右表索引,右连接建左边索引,因为这是由于左右连接特性决定的,左连接左表一定都有,右表成了关键点,所以右表一定要建立索引,右连接反之。

三、三表

创建索引之前:type=ALL全表扫描,rows=60

1d0dcc868b302547cb3219b8725bf125.png

从上面两表或查询中总结出左连接建右表,那么这里给phone表和book表创建索引

2ab1e44627388337b2bd3676af1673bb.png

创建好索引后查看结论

7f39d91b45b14ea60f234f27aacf4799.png

此时看到后两行的type都为ref,中rows=22,优化的很好,因此索引最好建立在经常查询的字段中

四、索引失效

974080b9ff344cf76f10d40eef119609.png

最佳左前缀法则:如果索引了多列,指的是查询从索引的最左抢前列开始并且不跳过索引中的列

问题:如何解决like %字符串%索引失效

1、百分号只写右边aa%不失效

2、使用覆盖索引【何为覆盖索引见我的上一篇文章MySQL的explain中有解释】

小结:

021c655843a8da7dd7f72e38e4dc3f91.png

优化口诀:

fbeb173d9b999bd107fae873718ac082.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值