+-------+----------+-------+----------+---------------------+
| id | name | age | position | hire_time |
+-------+----------+-------+----------+---------------------+
| 17052 | aaa10001 | 10001 | dev | 2020-03-15 16:23:43 |
| 17053 | aaa10002 | 10002 | dev | 2020-03-15 16:23:43 |
| 17054 | aaa10003 | 10003 | dev | 2020-03-15 16:23:43 |
| 17055 | aaa10004 | 10004 | dev | 2020-03-15 16:23:43 |
| 17056 | aaa10005 | 10005 | dev | 2020-03-15 16:23:43 |
| 17057 | aaa10006 | 10006 | dev | 2020-03-15 16:23:43 |
| 17058 | aaa10007 | 10007 | dev | 2020-03-15 16:23:43 |
| 17059 | aaa10008 | 10008 | dev | 2020-03-15 16:23:43 |
| 17060 | aaa10009 | 10009 | dev | 2020-03-15 16:23:43 |
| 17061 | aaa10010 | 10010 | dev | 2020-03-15 16:23:43 |
+-------+----------+-------+----------+---------------------+
10 rows in set
+------+---------+------+----------+---------------------+
| id | name | age | position | hire_time |
+------+---------+------+----------+---------------------+
| 9052 | aaa2001 | 2001 | dev | 2020-03-15 16:17:32 |
| 9053 | aaa2002 | 2002 | dev | 2020-03-15 16:17:32 |
| 9054 | aaa2003 | 2003 | dev | 2020-03-15 16:17:32 |
| 9055 | aaa2004 | 2004 | dev | 2020-03-15 16:17:32 |
| 9056 | aaa2005 | 2005 | dev | 2020-03-15 16:17:33 |
+------+---------+------+----------+---------------------+
5 rows in set
+------+------+-----+----------+---------------------+
| id | name | age | position | hire_time |
+------+------+-----+----------+---------------------+
| 7052 | aaa1 | 1 | dev | 2020-03-15 16:16:03 |
| 7053 | aaa2 | 2 | dev | 2020-03-15 16:16:03 |
| 7054 | aaa3 | 3 | dev | 2020-03-15 16:16:03 |
| 7055 | aaa4 | 4 | dev | 2020-03-15 16:16:03 |
| 7056 | aaa5 | 5 | dev | 2020-03-15 16:16:03 |
+------+------+-----+----------+---------------------+
5 rows in set
ain select * from employees where id > 2000 limit 5;
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | employees | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 7786 | 100 | Using where |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set
mysql> explain select * from employees limit 2
000,5;
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------+
| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 15572 | 100 | NULL |
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+-------+
1 row in set
mysql>
,5;
+-------+---------+------+----------+---------------------+
| id | name | age | position | hire_time |
+-------+---------+------+----------+---------------------+
| 11129 | aaa4078 | 4078 | dev | 2020-03-15 16:19:35 |
| 11130 | aaa4079 | 4079 | dev | 2020-03-15 16:19:35 |
| 7459 | aaa408 | 408 | dev | 2020-03-15 16:16:24 |
| 11131 | aaa4080 | 4080 | dev | 2020-03-15 16:19:35 |
| 11132 | aaa4081 | 4081 | dev | 2020-03-15 16:19:35 |
+-------+---------+------+----------+---------------------+
5 rows in set
mysql> explain
select * from employees ORDER BY name limit 9000,5;
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+----------------+
| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 15572 | 100 | Using filesort |
+----+-------------+-----------+------------+------+---------------+------+---------+------+-------+----------+----------------+
1 row in set
mysql>
+-------+---------+------+----------+---------------------+-------+
| id | name | age | position | hire_time | id |
+-------+---------+------+----------+---------------------+-------+
| 11129 | aaa4078 | 4078 | dev | 2020-03-15 16:19:35 | 11129 |
| 11130 | aaa4079 | 4079 | dev | 2020-03-15 16:19:35 | 11130 |
| 7459 | aaa408 | 408 | dev | 2020-03-15 16:16:24 | 7459 |
| 11131 | aaa4080 | 4080 | dev | 2020-03-15 16:19:35 | 11131 |
| 11132 | aaa4081 | 4081 | dev | 2020-03-15 16:19:35 | 11132 |
+-------+---------+------+----------+---------------------+-------+
5 rows in set
mysql> explain select * from employees e inner join (select id from employees order by name limit 9000,5) ed on e.id = ed.id;e
+----+-------------+------------+------------+--------+---------------+-----------------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+--------+---------------+-----------------------+---------+-------+------+----------+-------------+
| 1 | PRIMARY | <derived2> | NULL | ALL | NULL | NULL | NULL | NULL | 9005 | 100 | NULL |
| 1 | PRIMARY | e | NULL | eq_ref | PRIMARY | PRIMARY | 4 | ed.id | 1 | 100 | NULL |
| 2 | DERIVED | employees | NULL | index | NULL | idx_name_age_position | 140 | NULL | 9005 | 100 | Using index |
+----+-------------+------------+------------+--------+---------------+-----------------------+---------+-------+------+----------+-------------+
3 rows in set
原 SQL 使用的是 filesort 排序,而优化后的 SQL 使用的是索引排序。
Join关联查询优化
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------+
| 1 | SIMPLE | t2 | NULL | ALL | idx_a | NULL | NULL | NULL | 100 | 100 | NULL |
| 1 | SIMPLE | t1 | NULL | ALL | idx_a | NULL | NULL | NULL | 10180 | 100 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------+
2 rows in set
mysql> set global query_cache_size=0;
Query OK, 0 rows affected
mysql> set global query_cache_type=0;
Query OK, 0 rows affected
mysql>
EXPLAIN select count(1) from employees;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
1 row in set
mysql> EXPLAIN select count(id) from employees;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
1 row in set
mysql> EXPLAIN select count(name) from employees;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
1 row in set
mysql>
EXPLAIN select count(*) from employees;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
1 row in set
mysql> show table status like 'employees'
-> ;
+-----------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+-----------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+------------+
| employees | InnoDB | 10 | Dynamic | 15572 | 102 | 1589248 | 0 | 540672 | 4194304 | 22630 | 2020-03-14 18:21:24 | 2020-03-15 16:27:23 | NULL | utf8_general_ci | NULL | | 员工记录表 |
+-----------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+------------+
1 row in set
mysql>