MySQL 优化学习3 -- in语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26437925/article/details/83142565

实践的mysql 版本如下

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.40, for macos10.13 (x86_64) using  EditLine wrapper

in 语句

对id主键使用in语句查看(如下对语句2,3)
对于语句3,发现查询的类型是range,而非index

mysql> explain select count(*) from test_user where id = 10;
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table     | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | test_user | const | PRIMARY       | PRIMARY | 8       | const |    1 | Using index |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select count(*) from test_user where id in (10);
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table     | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | test_user | const | PRIMARY       | PRIMARY | 8       | const |    1 | Using index |
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select count(*) from test_user where id in (10,11,12);
+----+-------------+-----------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table     | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-----------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SIMPLE      | test_user | range | PRIMARY       | PRIMARY | 8       | NULL |    3 | Using where; Using index |
+----+-------------+-----------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0.01 sec)

mysql>

使用 SpringBoot MyBatis 项目测试

代码比较简单,主要是查看in内容的增长对查询效率的影响(使用数据库orm后肯定是要比直接SQL命令行查询要费时一些的)

在这里插入图片描述

application.properties中加入类似如下语句,以便查看log的时候能够看到执行的sql

logging.level.com.example.demo.repository.mapper=debug

在这里插入图片描述

in的数量 耗时(测试一次的毫秒数)
10 383
500 492
1000 558
10000 1034

上表是实际测试打印出来的耗时,首先说明这个耗时可能是不准确的(我只测了一次,且并没有测试接口的并发),但是至少说明,查询类型确实是range (随着in的内容越多,查询是越来越耗时,且应当知道sql的查询语句是有长度限制的)

发现上述都是连续的范围数,将代码改成3L * i

in的数量 耗时(测试一次的毫秒数)
10 383
500 529
1000 620
10000 1021

差不多时间,也可能测试不够.

  1. 总之网上不给mysql版本,不给出足够的测试,说in数据的顺序会影响查询是不科学的。
  2. id注意到是主键,我测非主键的情况也差不多,可以通过explain查询语句和实际测试

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/83142565