SQL优化-单表优化

最近在学SQL优化相关的知识,这里就写篇关于单表优化相关的博客,方便以后写sql时能直接注意到一些关于优化方面的问题,从而能sql性能。
本文取例自颜群老师的讲课。
在这篇文章之前必须会explain分析sql语句。
本文暂未排版,后续会更新夺标优化,会一起排版。

CREATE TABLE book(
bid int (4) primary key,
name VARCHAR(20) NOT NULL,
authorid INT(4) NOT NULL,
publicid INT(4) NOT NULL,
typeid INT(4) NOT NULL
);
INSERT INTO book VALUES(1,'tjava',1,1,2);
INSERT INTO book VALUES(1,'tc',2,3,1);
INSERT INTO book VALUES(1,'wx',3,2,2);
INSERT INTO book VALUES(1,'math',4,2,3);

查询authorid=1且typeid为2或3的bid
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1;
有图如下:
在这里插入图片描述
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1 ORDER BY typeid DESC;
有图如下:
在这里插入图片描述
优化
–首先想到加索引,这里就先把三个字段都加上索引,用组合索引
ALTER TABLE book ADD INDEX index_bta (bid,typeid,authorid);
再执行查询与上面对比
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1 ORDER BY typeid DESC;
有图如下:
SQL优化-单表优化_第1张图片
发现有提升,type:all->index,extra:出现了Using index,还不够啊!!!
–看索引加的对不对(字段,顺序这些方面)
—组合索引有最左匹配原则,那解析字段的先后顺序就应该对应着组合索引的从左到右的顺序。
sql编写顺序:
select distinct…from…join…on…where…group by…having…order by…limit…
sql解析顺序:
from…on…join…where…group by…having…select distinct…order by…limit…
可以看出bid是在typeid和authorid后面解析,所以可以调整组合索引里面的字段顺序:
ALTER TABLE book ADD INDEX index_tab(typeid,authorid,bid);
—虽然可以回表查询bid(从而在索引中删除bid),但是将bid放到索引中可以提升使用using index(就是覆盖索引的实现),所以保留bid不删。
再执行查询与上面对比
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1 ORDER BY typeid DESC;
有图如下:
SQL优化-单表优化_第2张图片
索引进行优化后,应该将之前的废弃索引删除,防止干扰。
如:之前(a,b,c),现在是(a,b),后者包含在前者中,有可能还是只用前者索引,造成干扰
DROP INDEX index_bta ON book;
再执行查询与上面对比
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1 ORDER BY typeid DESC;
有图如下:
SQL优化-单表优化_第3张图片
这里没有什么变化。

–接着优化
范围查询in有时会失效,这样这里authorid也会跟着失效,所以交换索引的顺序,将typeid放到authorid后面
ALTER TABLE book ADD INDEX index_atb(authorid,typeid,bid);
DROP INDEX index_tab ON book;—删除废弃的索引
再执行查询与上面对比
EXPLAIN SELECT bid FROM book WHERE typeid IN(2,3) AND authorid = 1 ORDER BY typeid DESC;
有图如下:
SQL优化-单表优化_第4张图片
小结:
1.最佳左前缀,保持索引的定义和使用顺序一致性
2.索引需要逐步优化
3.将含in的范围查询放到where条件的最后防止失效

为什么同时有using where(要回原表)和using index(不用回原表),一会要回原表一会不用回,这里不矛盾吗?
答:查authorid的时候,索引里面有,不用回原表,所以using index;而查typeid时,可能使索引失效,所以要回原表。
通过将in改成=来进行验证
EXPLAIN SELECT bid FROM book WHERE typeid=2 AND authorid = 1 ORDER BY typeid DESC;
有图如下:
SQL优化-单表优化_第5张图片

你可能感兴趣的:(MySQL,SQL优化,索引)