索引案例一:单表优化案例

 
 

http://www.jianshu.com/p/7f2b41d6687d

SQL如下

CREATE TABLE
IF NOT EXISTS article (
    id INT (10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    author_id INT (10) UNSIGNED NOT NULL,
    catrgory_id INT (10) UNSIGNED NOT NULL,
    views INT (10) UNSIGNED NOT NULL,
    comments INT (10) UNSIGNED NOT NULL,
    title VARBINARY (255) NOT NULL,
    content TEXT NOT NULL
);

INSERT INTO `test`.`article` (
    `author_id`,
    `catrgory_id`,
    `views`,
    `comments`,
    `title`,
    `content`
)
VALUES
(
        1,
        1,
        1,
        1,
        '1',
        '1'
    ),
(
        2,
        2,
        2,
        2,
        '2',
        '2'
    ),  
(
        1,
        1,
        3,
        3,
        '3',
        '3'
    );

说明:这里只有三条数据,这是一个新闻表,会有百万级别的数据。

问题:
查询catrgory_id为1且comments大于1的情况下,views最多的article_id

SQL如下

EXPLAIN SELECT
    id,
    author_id
FROM
    article
WHERE
    catrgory_id = 1
AND comments > 1
ORDER BY
    views DESC
LIMIT 1;

Paste_Image.png
Paste_Image.png

结论:很显然type是ALL,即最坏的情况。Extra里居然还出现了Using filesort,也是最坏的情况,数据量大的情况必须优化。

开始优化

Paste_Image.png
Paste_Image.png

创建完上步骤索引,再次explain,如下结果:

Paste_Image.png
Paste_Image.png

为什么还出现Using filesort?显然不可接受。原理如下:

Paste_Image.png
Paste_Image.png

显然索引创建的不合适,需要删除重新建立

Paste_Image.png
Paste_Image.png

为什么不建立comments索引直接跳过了呢?
因为经过上面分析可知comments是个范围值(>、<、in、between...and等),mysql无法利用索引在对后面的views部分进行检索,即range类型查询字段后面的索引无效,因为是按照BTREE索引工作原理来排序的,先排序catrgory_id,在排序comments,comments匹配多个值,索引直接卡壳了,无法继续后面的了。

Paste_Image.png
Paste_Image.png

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:



作者:编程界的小学生
链接:http://www.jianshu.com/p/7f2b41d6687d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值