当前位置: 首页 > news >正文

查询优化之单表查询

建表

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了

http://www.lryc.cn/news/62318.html

相关文章:

  • ChatGPT写小论文
  • 公共资源包发布流程详解
  • 设计模式简谈
  • day35—选择题
  • mybatis的<foreach>标签使用
  • 干货 | 被抑郁情绪所困扰?来了解CBT吧!
  • 每日一个小技巧:1招教你手机消除笔怎么用
  • 4月26号软件更新资讯合集....
  • 尚硅谷大数据项目【电商数仓5.0】学习笔记
  • vue3配置router路由并实现页面跳转
  • Java中字符串的初始化详解
  • 面向对象(七)-- 代码块
  • 《编程思维与实践》1037.一元多项式乘法
  • top命令学习
  • PHP数组的功能及实现案例
  • Cesium实践(4)——空间数据加载
  • FreeRTOS(三)——应用开发(一)
  • 这些 Linux 的自动化技巧,教你轻松完成任务
  • PAL制搜台
  • SpringBoot 使用 Docker Registry Api
  • Win10任务栏卡死怎么办?这3个方法快收藏!
  • 这一篇搞定Spring
  • 软测如果这么学,培训班都得倒闭,直接省去上万元的学费
  • 赎金信(Hash的应用)
  • 4月更新!EasyOps®全平台27项新功能一口气来袭~
  • 程序计算任意连续的12个月公里数不超三万公里预警
  • 【IMU】IMU知多少之42866
  • 谁说不能用中文写代码?
  • Java阶段二Day07
  • React Native iOS打包详细步骤