MySQL的四种不同查询的分析

发表于:2012-3-01 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:inter12    来源:51Testing软件测试网采编

  第三步:根据非聚集索引查询

  1. mysql> select name ,gender from person4index where gender in ("male","female");  
  2. +----------+--------+  
  3. | name     | gender |  
  4. +----------+--------+  
  5. | wenwen   | female |  
  6. | zhaoming | male   |  
  7. +----------+--------+  
  8. 2 rows in set (0.00 sec)

  查看器执行计划:

  1. mysql> explain select name ,gender from person4index where gender in ("male","female");  
  2. +----+-------------+--------------+-------+---------------+--------+---------+------+------+-------------+  
  3. | id | select_type | table        | type  | possible_keys | key    | key_len | ref  | rows | Extra       |  
  4. +----+-------------+--------------+-------+---------------+--------+---------+------+------+-------------+  
  5. |  1 | SIMPLE      | person4index | range | gender        | gender | 12      | NULL |    2 | Using where |  
  6. +----+-------------+--------------+-------+---------------+--------+---------+------+------+-------------+  
  7. 1 row in set (0.00 sec)

  可以看出,走的也是范围索引。同主键查询,那么就看其消耗时间了

  1. mysql> show profiles;  
  2. +----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+  
  3. | Query_ID | Duration   | Query                                                                                                                                               |  
  4. +----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+  
  5. |       68 | 0.00106600 | select name ,gender from person4index where gender in ("male","female")                                                                             |  
  6. |       69 | 0.00092500 | explain select name ,gender from person4index where gender in ("male","female")                                                                     |  
  7. +----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+  
  8. 15 rows in set (0.00 sec)

  这个非主键索引消耗的时间为:0.00106600,可以看出略大于组件索引消耗的时间。

  看其具体消耗的阶段:

  1. mysql> show profile for query 68 ;  
  2. +--------------------------------+----------+  
  3. | Status                         | Duration |  
  4. +--------------------------------+----------+  
  5. | starting                       | 0.000059 |  
  6. | checking query cache for query | 0.000111 |  
  7. | Opening tables                 | 0.000085 |  
  8. | System lock                    | 0.000023 |  
  9. | Table lock                     | 0.000067 |  
  10. | init                           | 0.000183 |  
  11. | optimizing                     | 0.000031 |  
  12. | statistics                     | 0.000139 |  
  13. | preparing                      | 0.000035 |  
  14. | executing                      | 0.000020 |  
  15. | Sending data                   | 0.000148 |  
  16. | end                            | 0.000024 |  
  17. | query end                      | 0.000019 |  
  18. | freeing items                  | 0.000043 |  
  19. | storing result in query cache  | 0.000042 |  
  20. | logging slow query             | 0.000017 |  
  21. | cleaning up                    | 0.000020 |  
  22. +--------------------------------+----------+  
  23. 17 rows in set (0.00 sec)

  看几个关键词的点;init,statistics,Sending data 这几个关键点上的消耗向比较主键的查询要大很多,特别是Sending data。因为若是走的非聚集索引,那么就需要回表进行再进行一次查询,多消耗一次IO。

  第四步:根据覆盖索引查询数据

  1. mysql> select gender ,name from person4cindex where gender in ("male","female");  
  2. +--------+----------+  
  3. | gender | name     |  
  4. +--------+----------+  
  5. | female | wenwen   |  
  6. | male   | zhaoming |  
  7. +--------+----------+  
  8. 2 rows in set (0.01 sec)

  这里需要注意的是,我的字段查询顺序变了,是gender,name而不在是前面的name,gender,这样是为了走覆盖索引。具体看效果吧

  还是先看执行计划:

  1. mysql> explain select gender ,name from person4cindex where gender in ("male","female");  
  2. +----+-------------+---------------+-------+---------------+------+---------+------+------+--------------------------+  
  3. | id | select_type | table         | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |  
  4. +----+-------------+---------------+-------+---------------+------+---------+------+------+--------------------------+  
  5. |  1 | SIMPLE      | person4cindex | index | NULL          | name | 44      | NULL |    2 | Using where; Using index |  
  6. +----+-------------+---------------+-------+---------------+------+---------+------+------+--------------------------+  
  7. 1 row in set (0.00 sec)

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号