查询优化之单表查询

文章讨论了如何通过创建和优化索引来提升MySQL数据库的查询效率。首先,通过示例展示了当查询条件包含范围值时,原始索引无法有效工作。接着,解释了BTree索引的工作原理,并指出在这种情况下,应调整索引顺序以匹配查询条件。最后,通过删除并重建索引,成功将查询类型从range变为ref,消除了Usingfilesort,从而提高了查询性能。
摘要由CSDN通过智能技术生成

建表

CREATE TABLE IF NOT EXISTS `article` (
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) UNSIGNED NOT NULL,
`category_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 `article`(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'),
(2, 2, 2, 2, '2', '2'),
(1, 1, 3, 3, '3', '3');
 
SELECT * FROM article;

在这里插入图片描述

例题

  • 查询 category_id 为1 且 comments 大于 1 的情况下,views 最多的 article_id

一般

我们一般会使用以下语句查询

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

在这里插入图片描述
这个sql语句的type是all,并且Extra里面出现了Using filesort,这个必须优化

添加索引

CREATE INDEX idx_article_ccv ON article(category_id,comments,views);

我们再次进行上面语句的查询

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

在这里插入图片描述
我们可以看到type变成了range,但是extra里面却是Using filesort ,这个性能有点差

优化索引

BTree 索引的工作原理
  1. 他会先排序category_id
  2. 遇到相同的category_id 在排序comments
  3. 遇到相同的comments 在排序views

在上面语句中comments > 1 是一个范围值(所谓range),range 类型查询字段后面的索引无效,所以MySQL 无法利用索引再对后面的 views 部分进行检索

进行优化
  1. 我们删除索引后进行新建索引
DROP INDEX idx_article_ccv ON article;
  1. 新建索引
CREATE INDEX idx_article_cv ON article(category_id,views);
  1. 执行slq语句
EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;

在这里插入图片描述
我们发现type变成了ref,也没有存在Using filesort了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值