`
zy116494718
  • 浏览: 476776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql order by 索引

 
阅读更多

 

MySql性能优化,order by 不走索引的思考
2009-07-12 11:43

今天早上查看网站,发现非常慢!进Linux 用top查看,发现MySQL cpu到了100%。开始怀疑是mysql性能的问题,不会10万条数据就卡成这样吧?虽然我的linux是在服务器上放了个虚拟机,但也不至于10万条记录挂啊? 网上找了一大把文章,my.cnf也设置了,我虚拟机内存是2G,将key_buf设置成512M 还是卡。非常郁闷!

 

最后没办法,只能用explain来找原因了。结果还真找到了。所以说用mysql写查询语句,一定要注意索引,一个不小心,性能那是十万八千里。OK,下面分享下查找过程:

 

首先上原始的查询语句,我只用了一个id字段,方便检查。

explain select id from collect where vtype=1 order by id asc;
+----+-------------+---------+------+---------------+-------+---------+-------+-------+-----------------------------+
| id | select_type | table   | type | possible_keys | key   | key_len | ref   | rows | Extra                       |
+----+-------------+---------+------+---------------+-------+---------+-------+-------+-----------------------------+
| 1 | SIMPLE      | collect | ref | vtype         | vtype | 5       | const | 93237 | Using where; Using filesort |
+----+-------------+---------+------+---------------+-------+---------+-------+-------+-----------------------------+
看上面,最后的Extra 部分:竟然出现 Using filesort ! 我晕,全表查询。但是 prossible keys 已经使用到了vtype啊? 看来并不是where 条件的问题。

为了测试,将2条语句分别执行下看:

mysql> select id from collect where vtype=1 order by id asc limit 0,20;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
+----+
20 rows in set (10.28 sec)
查找20条数据,花了 10.28 秒! 非常的晕。

再看:

mysql> select id from collect where vtype=1 limit 0,20;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
+----+
20 rows in set (0.01 sec)
少了order by 基本上秒查!

为什么会出现以上问题呢?order by id asc, id 字段可是主键啊,按理说应该是非常快的索引,但是mysql 好像并没有用到。再测试

mysql> explain select * from collect order by id asc;
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows   | Extra          |
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
| 1 | SIMPLE      | collect | ALL | NULL          | NULL | NULL    | NULL | 103997 | Using filesort |
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
看上面的分析,我直接select * order by id asc ,也是用到了filesort ,用到了这个肯定查询在10秒以上了。

mysql> explain select id from collect order by id asc;
+----+-------------+---------+-------+---------------+---------+---------+------+--------+-------------+
| id | select_type | table   | type | possible_keys | key     | key_len | ref | rows   | Extra       |
+----+-------------+---------+-------+---------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE      | collect | index | NULL          | PRIMARY | 4       | NULL | 103997 | Using index |
+----+-------------+---------+-------+---------------+---------+---------+------+--------+-------------+
而上面的,将* 改成id ,Using index 了,看来直接查找id 会使性能提高。

mysql> explain select id,url,title from collect order by id asc;
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows   | Extra          |
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
| 1 | SIMPLE      | collect | ALL | NULL          | NULL | NULL    | NULL | 103997 | Using filesort |
+----+-------------+---------+------+---------------+------+---------+------+--------+----------------+
1 row in set (0.00 sec)
而再加上另外的字段,order by 就没任何性能提高了。还是Using fielsort !

从上面可以看出order by 不能乱用!不知道网上哪个傻逼说用了limit 最好用order by 这样会让分页的性能加快!简直是放屁。经过实际测试,limit 和order by 没有任何关联!而以前写程序的时候经常会用order by id asc 。 可能是数据从来没有上过10万条的缘故,感觉还行,今天用了10万条采集数据做测试,慢得一塌糊涂!

好了,现在仔细想想order by 用到索引的场合:

 

1) 如果select 只查询索引字段,order by 索引字段会用到索引,要不然就是全表排列;

2) 如果有where 条件,比如where vtype=1 order by vtype asc . 这样order by 也会用到索引!

3) 综上,如果order by 真的影响limit的话,那么就请在没有where 查询的时候order by id(主键), 有where 查询的时候,order by (索引) 字段。

 

4) 别迷信网上文章,多explain,并且要相信mysql 依然很坚挺,别出现慢的情况就想,免费的性能就这样?

测试继续,到了100条记录,1000万条再来测试mysql 的性能。

测试环境:目前数据量1.4G,10万记录,core 4200,4G内存,vm6.0虚拟机(Linux centos5 , 2G内存,60G硬盘)下测试!

 

 

参考文章:http://blog.csdn.net/militala/article/details/6066671

分享到:
评论

相关推荐

    MySQL Order By索引优化方法

    比如,当`ORDER BY`的字段完全包含在索引中,或者与`WHERE`子句中的条件匹配时,MySQL可以高效地利用索引。以下是一些能够使用索引优化`ORDER BY`的例子: 1. 查询按索引完全顺序排列的数据: ```sql SELECT * ...

    MySQL 通过索引优化含ORDER BY的语句

    MySQL数据库在处理含`ORDER BY`的SQL语句时,索引优化是非常关键的一环,因为这直接影响到查询性能。以下是一些关于如何利用索引来优化`ORDER BY`语句的知识点: 1. **合理创建索引**:索引可以显著提高数据读取...

    MYSQL order by排序与索引关系总结1

    MySQL中的ORDER BY排序与索引关系是数据库性能优化的关键因素之一。本文主要针对InnoDB存储引擎的B-Tree索引进行探讨,不涉及索引设计,而是关注如何有效利用索引来提升查询性能。 首先,遵循**最左前缀法则**是...

    mysql数据库以及索引详解.pptx

    - 在一个SELECT语句中,索引只能使用一次(如在WHERE中使用后,在ORDER BY中不再有效)。 - 在查询条件中使用不等于符号(包括<、>、!=)可能导致索引失效。 通过理解MySQL及其索引的基本概念,开发者可以更好地...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

    mysql多条件索引

    例如,对于`name, age, id`的多列索引,查询条件`name='nginx.cn' and age in(15,16,17)`可以使用整个索引,但如果加上`order by id`,`id`的范围查询将使索引无法完全发挥作用。 多列索引适合的场景包括: 1. 全...

    mysql order by limit 的一个坑.docx

    解决这个问题的方法是:在 ORDER BY 列中包含一个索引列,例如,我们可以在 ORDER BY 列中加上主键 id,这样可以确保 MySQL 按照正常的排序顺序返回记录。 MySQL 的官方文档中也提到这个问题,原文如此描述: “If...

    为mysql数据库建立索引.docx

    在本文中,我们将详细介绍如何为MySQL数据库建立索引,包括单字段索引、多字段索引、组合索引和ORDER BY索引等。同时,我们还将介绍使用EXPLAIN命令来测试数据库是否真正使用了这些索引。 单字段索引 ------------ ...

    mysql添加索引.pdf

    因此,在设计数据库时,应谨慎选择需要索引的列,通常关注那些出现在JOIN条件、WHERE子句、GROUP BY或ORDER BY中的列。同时,定期监控和评估索引的性能,通过`ANALYZE TABLE`或`OPTIMIZE TABLE`命令进行调整,以保持...

    MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个...

    mysql查询优化之索引优化

    - **选择合适的索引列**:索引应该建在经常出现在WHERE子句、JOIN条件和ORDER BY子句中的列上。 - **避免过度索引**:过多的索引会增加写操作的开销,因此需要权衡读写性能。 - **复合索引**:如果一个查询涉及多...

    mysql索引优化分享

    关于mysql索引一些优化介绍与创建原则,还有对order by排序的算法的介绍等等

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    - **符合最佳左前缀法则**:如果`ORDER BY`的列是索引的左前缀,且满足查询条件,MySQL可以利用索引直接完成排序。 - **示例1**: 对于索引`KEY idx_age_birth_name (age, birth, name)`,以下查询不会使用`Using ...

    Mysql索引优化案例.pdf

    Mysql索引优化案例 在对数据库进行操作时,尤其是在处理包含大量数据的表时,查询的性能问题是一个常见且重要的话题。在实际工作中,对于Mysql数据库进行索引优化是提高查询效率、减少查询时间的重要手段。本案例将...

    MySQL的or、in、union与索引优化

    SELECT * FROM order WHERE status IN (0, 1) ORDER BY date DESC; ``` 此查询可以利用`status`和`date`的索引来提高效率,特别是如果这两个字段都有索引的话。 4. **组合条件查询**: ``` SELECT * FROM ...

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    - **加速排序**:对于ORDER BY等操作,索引可以帮助加速排序过程。 - **减少磁盘I/O操作**:索引可以减少磁盘I/O操作次数,提高查询速度。 ##### 2、索引的缺点 - **占用额外空间**:每个索引都需要占用一定的磁盘...

    mysql高级视频教程百度云(2019).txt

    48.MySQL高级_为排序使用索引OrderBy优化.avi 47.MySQL高级_in和exists.avi 46.MySQL高级_小表驱动大表.avi 45.MySQL高级_索引优化答疑补充和总结口诀.avi 44.MySQL高级_索引面试题分析.avi 43.MySQL高级...

Global site tag (gtag.js) - Google Analytics