服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - mysql慢查询优化之从理论和实践说明limit的优点

mysql慢查询优化之从理论和实践说明limit的优点

2020-09-20 15:56stpeace Mysql

今天小编就为大家分享一篇关于mysql慢查询优化之从理论和实践说明limit的优点,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

很多时候, 我们预期查询的结果最多是1条记录数据, 那么这个时候, 最好用上limit 1,  当查到这条数据后, mysql会立即终止继续查询, 不进行更多的无用查询, 从而提升了效率。

我们来实际测试一下, 在一个拥有10万的mysql表中, 查找lily的分数(假设系统中只有1个lily, 而我们预期也只需要这条数据)。为了显示出时间的差别, 我并不对表的name字段建索引。

先看看表结构:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> show create table tb_province;
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                           |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_province | CREATE TABLE `tb_province` (
 `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL,
 `score` int(10) unsigned DEFAULT '0',
 `x` int(10) unsigned DEFAULT '0',
 `x1` int(10) unsigned DEFAULT '0',
 `x2` int(10) unsigned DEFAULT '0',
 `x3` int(10) unsigned DEFAULT '0',
 `x4` int(10) unsigned DEFAULT '0',
 `x5` int(10) unsigned DEFAULT '0',
 `x6` int(10) unsigned DEFAULT '0',
 `x7` int(10) unsigned DEFAULT '0',
 `x8` int(10) unsigned DEFAULT '0',
 `x9` int(10) unsigned DEFAULT '0',
 `x10` int(10) unsigned DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124178 DEFAULT CHARSET=latin1 |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我们打开set profiling=1;的开关,执行mysql语句来对比:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
mysql> select score from tb_province where name='lily';
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.03 sec)
 
mysql> select score from tb_province where name='lily';
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.03 sec)
 
mysql> select score from tb_province where name='lily';
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.04 sec)
 
mysql> select score from tb_province where name='lily';
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.02 sec)
 
mysql> select score from tb_province where name='lily';
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.03 sec)
 
mysql> select score from tb_province where name='lily' limit 1;
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.00 sec)
 
mysql> select score from tb_province where name='lily' limit 1;
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.00 sec)
 
mysql> select score from tb_province where name='lily' limit 1;
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.00 sec)
 
mysql> select score from tb_province where name='lily' limit 1;
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.01 sec)
 
mysql> select score from tb_province where name='lily' limit 1;
+-------+
| score |
+-------+
|  100 |
+-------+
1 row in set (0.00 sec)

可见,我们针对是否采用limit 1进行了5次对比测试, 来看看结果吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show profiles;
+----------+------------+---------------------------------------------------------+
| Query_ID | Duration  | Query                          |
+----------+------------+---------------------------------------------------------+
|    5 | 0.02686000 | select score from tb_province where name='lily'     |
|    6 | 0.02649050 | select score from tb_province where name='lily'     |
|    7 | 0.03413500 | select score from tb_province where name='lily'     |
|    8 | 0.02601350 | select score from tb_province where name='lily'     |
|    9 | 0.02785775 | select score from tb_province where name='lily'     |
|    10 | 0.00042300 | select score from tb_province where name='lily' limit 1 |
|    11 | 0.00043250 | select score from tb_province where name='lily' limit 1 |
|    12 | 0.00044350 | select score from tb_province where name='lily' limit 1 |
|    13 | 0.00053200 | select score from tb_province where name='lily' limit 1 |
|    14 | 0.00043250 | select score from tb_province where name='lily' limit 1 |
+----------+------------+---------------------------------------------------------+
14 rows in set, 1 warning (0.00 sec)

可见,采用limit 1后, mysql语句的效率确实提升很多。 当表更大时, 效率提升会更加明显。 

我们已经从理论和实践的脚本都说明了limit的优点, 所以, 建议是:在可用limit的时候要用limit (当然, 如果结果是多个,肯定不能limit 1啊)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/stpeace/article/details/79123980

延伸 · 阅读

精彩推荐
  • Mysql深度解析MySQL 5.7之临时表空间

    深度解析MySQL 5.7之临时表空间

    尽管临时表在实际在线场景中很少会去显式使用,但在某些运维场景还是需要到的,在MySQL5.7中,专门针对临时表做了些优化,下面这篇文章我们来一起深...

    杨涛涛4722020-07-06
  • Mysqlmysql蠕虫复制基础知识点

    mysql蠕虫复制基础知识点

    在本篇内容中我们给大家分享了关于mysql蠕虫复制基础知识点,对此有需要的朋友们跟着学习下吧。...

    laozhang4152019-06-07
  • Mysql检查mysql是否成功启动的方法(bat+bash)

    检查mysql是否成功启动的方法(bat+bash)

    这篇文章主要介绍了检查mysql是否成功启动的方法(bat+bash),如果mysql没有启动则开启服务,需要的朋友可以参考下 ...

    服务器之家3132020-06-12
  • MysqlMySQL中InnoDB的Memcached插件的使用教程

    MySQL中InnoDB的Memcached插件的使用教程

    这篇文章主要介绍了MySQL中InnoDB的Memcached插件的使用教程,借助MySQL本身的复制功能,我们可以说变相地实现Memcached的复制需要的朋友可以参考下 ...

    MYSQL教程网2182020-05-10
  • MysqlMySQL页面访问统计及排名情况

    MySQL页面访问统计及排名情况

    这篇文章主要介绍了MySQL页面访问统计及排名情况,涉及到mysql页面访问统计,mysql统计排名相关知识,感兴趣的朋友一起学习吧 ...

    MYSQL教程网3572020-05-31
  • Mysqlmysql 5.7.11 winx64安装配置教程

    mysql 5.7.11 winx64安装配置教程

    这篇文章主要介绍了mysql 5.7.11 winx64安装配置教程,介绍了MySQL5.7安装及初始化,感兴趣的小伙伴们可以参考一下 ...

    莫铭3372020-06-18
  • MysqlMysql数据库中子查询的使用

    Mysql数据库中子查询的使用

    本文给大家分享mysql数据库中子查询的使用,非常不错具有参考借鉴价值,感兴趣的朋友一起看看吧...

    mrr2522020-06-29
  • MysqlMysql数据表中的蠕虫复制使用方法

    Mysql数据表中的蠕虫复制使用方法

    在本文中我们给大家分享了关于怎么使用Mysql数据表中的蠕虫复制的相关知识点,有兴趣的朋友们学习下。...

    laozhang4102019-06-07