mysql高级 --- 索引优化案例一
程序员文章站
2022-05-08 14:40:30
...
准备
首先需要一个表:
下面的表示以前用的,现在拿过来用
查询语句
查询 catalogid = 1且 num > 1 的价格最高的书
select * from book
where book.catalogid = 4 and num >1
order by book.price desc limit 1;
使用explain
注意看他type:ALL
所以他是全表扫描,这个肯定不好需要优化
优化方式:
- 1、优化sql语句(这个先不论)
- 2、优化索引
创建索引
一
创建语句:
create index book_catalogid_num_price on book(catalogid,num,price);
- 知道要使用是哪个字段的时候最简单且不用分析的时候就是讲是哪个字段都建立器索引
- 所以就建一个符合索引试一试
查看索引:
使用explain:
type:range
extra:出现了Using filesort(在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。)
所以这个还是可以优化的
出现Using filesort原因:
- 根本原因:排序没有使用到索引,也就是没有使用到price索引
但是我在简历复合索引的时候有包含price,为什么没有使用到呢?
原因:
- 这个涉及到索引的原理B+树
- 当建立一个复合索引的时候,它是由先后顺序的
- 在上面的例子中,它是先匹配catalogid,在匹配num,最后匹配price
- 但是在使用num >1 进行范围比较的时候,他不是一个确切的匹配的值,所以在它之后的索引就会失效
二
先删除上一个索引
drop index book_catalogid_num_price on book;
既然上面是因为num影响到了排序,那么,我可以不使用这个索引吗?
试试看!
创建语句:
create index book_catalogid_price on book(catalogid,price);
使用explain:
type:ref
这个基本上就是最优的了
三
实际上,我们一帮只会建立查询匹配的索引字段就行,也就是catalogid
创建语句:
create index book_catalogid on book(catalogid);
使用explain:
type:ref
虽然依旧会出现Using filesort,但是其实他已经不是很影响性能了
上一篇: MYSQL索引的由来及实现原理
下一篇: MySQL高级 一 之 索引