准备

首先需要一个表:

下面的表示以前用的,现在拿过来用

Mysql多机优化 mysql优化实战_字段

查询语句

查询 catalogid = 1且 num > 1 的价格最高的书

select * from book
where book.catalogid = 4 and num >1
order by book.price desc limit 1;

使用explain

Mysql多机优化 mysql优化实战_mysql_02


注意看他type:ALL

所以他是全表扫描,这个肯定不好需要优化

优化方式:

  • 1、优化sql语句(这个先不论)
  • 2、优化索引

创建索引

创建语句:

create index book_catalogid_num_price on book(catalogid,num,price);

  • 知道要使用是哪个字段的时候最简单且不用分析的时候就是讲是哪个字段都建立器索引
  • 所以就建一个符合索引试一试

查看索引:

Mysql多机优化 mysql优化实战_字段_03

使用explain:

Mysql多机优化 mysql优化实战_sql语句_04


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:

Mysql多机优化 mysql优化实战_Mysql多机优化_05


type:ref

这个基本上就是最优的了

实际上,我们一帮只会建立查询匹配的索引字段就行,也就是catalogid

创建语句:

create index book_catalogid on book(catalogid);

使用explain:

Mysql多机优化 mysql优化实战_mysql_06


type:ref

虽然依旧会出现Using filesort,但是其实他已经不是很影响性能了

索引索引使用规则

上面说因为使用范围让索引失效了,下面这篇博客说例一些失效的情况,也就是索引使用规则