慢查询SQL优化
记一次慢查询的SQL优化
测试表结构
MariaDB [shoppings]> desc login_userinfo;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| num | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | UNI | NULL | |
| password | varchar(40) | NO | | NULL | |
| nickname | varchar(16) | NO | | NULL | |
| sex | varchar(10) | NO | | NULL | |
| settime | datetime(6) | NO | | NULL | |
| addr | varchar(32) | NO | | NULL | |
| email | varchar(32) | NO | | NULL | |
| phone | varchar(11) | NO | | NULL | |
| receiver | varchar(64) | NO | | NULL | |
| code | varchar(6) | NO | | NULL | |
| comment_id | int(11) | YES | MUL | NULL | |
+------------+-------------+------+-----+---------+----------------+
12 rows in set (0.003 sec)
表中数据量
MariaDB [shoppings]> select count(*) from login_userinfo;
+----------+
| count(*) |
+----------+
| 11809884 |
+----------+
1 row in set (2.503 sec)
分页
MariaDB [shoppings]> select u.num, u.name, u.nickname, u.settime, u.addr,c.content from login_userinfo as u inner join login_comment as c on u.comment_id=c.id limit 10000000, 10;
+----------+--------------+--------------+----------------------------+------+---------+
| num | name | nickname | settime | addr | content |
+----------+--------------+--------------+----------------------------+------+---------+
| 20010049 | test20014998 | test20014998 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
| 20010050 | test20014999 | test20014999 | 2021-02-20 00:00:00.000000 | 北京 | 不太行 |
| 20010051 | test20015000 | test20015000 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010052 | test20015001 | test20015001 | 2021-02-20 00:00:00.000000 | 北京 | 不太行 |
| 20010053 | test20015002 | test20015002 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010054 | test20015003 | test20015003 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
| 20010055 | test20015004 | test20015004 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010056 | test20015005 | test20015005 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010057 | test20015006 | test20015006 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
| 20010058 | test20015007 | test20015007 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
+----------+--------------+--------------+----------------------------+------+---------+
10 rows in set (1 min 6.340 sec)
这次查询需要1分6秒,很明显当数据量过大时 查询效率会直线下降 ,使用者毫无体验(#-_-)
MariaDB [shoppings]> explain select u.num, u.name, u.nickname, u.settime, u.addr,c.content from login_userinfo as u inner join login_comment as c on u.comment_id=c.id limit 10000000, 10;
查看执行计划会看到它可能进行了全表扫描
MariaDB [shoppings]> explain select u.num, u.name, u.nickname, u.settime, u.addr,c.content from login_userinfo as u inner join login_comment as c on u.comment_id=c.id limit 10000000, 10;
+------+-------------+-------+-------+--------------------------------------------------------+--------------------------------------------------------+---------+----------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+-------+--------------------------------------------------------+--------------------------------------------------------+---------+----------------+--------+-------------+
| 1 | SIMPLE | c | index | PRIMARY | content | 380 | NULL | 17 | Using index |
| 1 | SIMPLE | u | ref | Login_userinfo_comment_id_3d2eced3_fk_Login_comment_id | Login_userinfo_comment_id_3d2eced3_fk_Login_comment_id | 5 | shoppings.c.id | 681715 | |
+------+-------------+-------+-------+--------------------------------------------------------+--------------------------------------------------------+---------+----------------+--------+-------------+
2 rows in set (0.001 sec)
优化
查询主键num值
MariaDB [shoppings]> select num from login_userinfo limit 10000000,1;
+----------+
| num |
+----------+
| 20010043 |
+----------+
1 row in set (3.259 sec)
MariaDB [shoppings]> explain select num from login_userinfo limit 10000000,1;
+------+-------------+----------------+-------+---------------+--------------------------------------------------------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------------+-------+---------------+--------------------------------------------------------+---------+------+----------+-------------+
| 1 | SIMPLE | login_userinfo | index | NULL | Login_userinfo_comment_id_3d2eced3_fk_Login_comment_id | 5 | NULL | 10907448 | Using index |
+------+-------------+----------------+-------+---------------+--------------------------------------------------------+---------+------+----------+-------------+
1 row in set (0.000 sec)
虽然我们也进行了全表扫描,但是我们用的是主键索引,所以效率会更高。
通过主键num值,查询
MariaDB [shoppings]> select u.num, u.name, u.nickname, u.settime, u.addr,c.content from login_userinfo as u inner join login_comment as c on u.comment_id=c.id where u.num>20010043 limit 10;
+----------+--------------+--------------+----------------------------+------+---------+
| num | name | nickname | settime | addr | content |
+----------+--------------+--------------+----------------------------+------+---------+
| 20010045 | test20014994 | test20014994 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
| 20010046 | test20014995 | test20014995 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010047 | test20014996 | test20014996 | 2021-02-20 00:00:00.000000 | 北京 | 不太行 |
| 20010048 | test20014997 | test20014997 | 2021-02-20 00:00:00.000000 | 上海 | 不太行 |
| 20010049 | test20014998 | test20014998 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
| 20010050 | test20014999 | test20014999 | 2021-02-20 00:00:00.000000 | 北京 | 不太行 |
| 20010051 | test20015000 | test20015000 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010052 | test20015001 | test20015001 | 2021-02-20 00:00:00.000000 | 北京 | 不太行 |
| 20010053 | test20015002 | test20015002 | 2021-02-20 00:00:00.000000 | 广州 | 不太行 |
| 20010054 | test20015003 | test20015003 | 2021-02-20 00:00:00.000000 | 深圳 | 不太行 |
+----------+--------------+--------------+----------------------------+------+---------+
10 rows in set (0.020 sec)
MariaDB [shoppings]> explain select u.num, u.name, u.nickname, u.settime, u.addr,c.content from login_userinfo as u inner join login_comment as c on u.comment_id=c.id where u.num>20010044 limit 10;
+------+-------------+-------+--------+----------------------------------------------------------------+---------+---------+------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+--------+----------------------------------------------------------------+---------+---------+------------------------+---------+-------------+
| 1 | SIMPLE | u | range | PRIMARY,Login_userinfo_comment_id_3d2eced3_fk_Login_comment_id | PRIMARY | 4 | NULL | 3638072 | Using where |
| 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | shoppings.u.comment_id | 1 | |
+------+-------------+-------+--------+----------------------------------------------------------------+---------+---------+------------------------+---------+-------------+
我们先拿到主键num的值 ,再通过num 进行查询。通过这两次查询 时间不到4秒。效率大大提升。
慢查询SQL优化的更多相关文章
- 查询SQL优化
SQL优化的一般步骤 通过show status命令了解各种SQL的执行频率定位执行效率较低的SQL语句,重点select通过explain分析低效率的SQL确定问题并采取相应的优化措施 优化措施 s ...
- 树形查询SQL优化一例
上周五一哥们发了条SQL,让我看看,代码如下: SELECT COUNT(1) FROM (select m.sheet_id from cpm_main_sheet_history m, cpm_s ...
- 1 min 数据查询 SQL 优化
问题 前几天线上数据库 IOPS 飙升,一直居高不下,最近并没有升级.遂查看数据库正在执行的 SQL 语句,发现有个查询离线设备的语句极其缓慢. 探寻原因 SELECT o.* FROM ( SELE ...
- oracle查询SQL优化相当重要
如果表中的时间字段是索引,那么时间字段不要使用函数,函数会使索引失效. 例如: select * from mytable where trunc(createtime)=trunc(sysdate) ...
- Mysql 分页查询sql优化
先查下数据表的总条数: SELECT COUNT(id) FROM ts_translation_send_address 执行分页界SQL 查看使用时间2.210s SELECT * FROM ts ...
- mysql联合查询sql优化
我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...
- 数据库的规范和SQL优化技巧总结
现总结工作与学习中关于数据库的规范设计与优化技巧 1.规范背景与目的 MySQL数据库与 Oracle. SQL Server 等数据库相比,有其内核上的优势与劣势.我们在使用MySQL数据库的时候需 ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
- SQL 查询性能优化----解决书签查找
先来看看什么是书签查找: 当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求.对一个有聚簇索引的表来说是一个键查找(key lookup), ...
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
随机推荐
- 一图读懂DCI版权服务
访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub.Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~
- MCM箱模型建模方法及大气O3来源解析
OBM箱模型可用于模拟光化学污染的发生.演变过程,研究臭氧的生成机制和进行敏感性分析,探讨前体物的排放对光化学污染的影响.箱模型通常由化学机理.物理过程.初始条件.输入和输出模块构成,化学机理是其核心 ...
- openGauss资源池化开发者入门指南(一)
openGauss资源池化开发者入门指南(一) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存储 ...
- ChatGPT 背后的“功臣”——RLHF 技术详解 以强化学习方式依据人类反馈优化语言模型
OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它面对多种多样的问题对答如流,似乎已经打破了机器和人的边界.这一工作的背后是大型语言模型 (Large Language Mode ...
- 报表如何集成 echarts 官网示例图
Echarts,江湖人称一个纯 Javascript 的图表库,图形种类星罗棋布且个个颜值爆表,可以轻松驾驭 PC 和移动设备,与绝大部分浏览器都可称兄道弟,而且已然众多拥趸,还有不少报表对它采取了嫁 ...
- C#的窗体假关闭操作例子 - 开源研究系列文章
晚上编码的时候,想到了以前编写的窗体关闭的事情,就是带托盘图标的应用,有一个主显示操作窗体,但是主窗体点击关闭按钮的时候,实际上是窗体隐藏而非真正关闭,这个在其它的一些应用程序里有这个效果.于是就想到 ...
- 大屏小程序探索实践 | Cube 技术解读
简介: 支付宝客户端有极强的动态化诉求,不论 iOS 还是 Android 平台,重新分发软件包从时间上,效率上难以满足产品运营的要求,因此客户端动态化技术应运而生. Cube 起源于 Native ...
- 基于 Mesh 的统一路由在海外业务的实践
简介:本文主要介绍我们最近在利用 Service Mesh 架构解决海外业务问题中一些实践和价值探索.我们在海外业务引入 Mesh 架构过程中,充分利用 Istio 的基于 yaml 来描述和定义路 ...
- 专访香侬科技:致力于让世界听到中文NLP的声音
像所有的创业者一样,香侬科技的初创团队胸怀梦想,期待有一天当人们提起香侬的时候,除了"信息论之父",还能想起来有一家用技术在链接大千世界的科技公司--香侬科技. 新生的香侬科技选 ...
- Java单元测试技巧之PowerMock
简介: 高德的技术大佬向老师在谈论方法论时说到:"复杂的问题要简单化,简单的问题要深入化." 这句话让我感触颇深,这何尝不是一套编写代码的方法--把一个复杂逻辑拆分为许多简单逻辑, ...