当前位置:  开发笔记 > 编程语言 > 正文

Mysql性能在600万行表上

如何解决《Mysql性能在600万行表上》经验,为你挑选了1个好方法。

有一天,我怀疑我必须学习hadoop并将所有这些数据传输到非结构化数据库,但我很惊讶地发现性能在如此短的时间内显着降低.

我有一个不到600万行的mysql表.我正在对这个表做一个非常简单的查询,并且相信我已经准备好了所有正确的索引.

查询是

SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date

解释返回

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  updateshows     range   date_idx    date_idx    7   NULL    648997  Using where

所以我尽可能使用正确的索引,但这个查询需要11秒才能运行.

数据库是MyISAM,phpMyAdmin表示表是1.0GiB.

这里有什么想法?

编辑:date_idx是日期和静脉列的索引.那些应该是两个单独的索引吗?



1> PatrikAkerst..:

您要确保的是查询将仅使用索引,因此请确保索引涵盖您选择的所有字段.此外,由于它涉及范围查询,因此需要在索引中首先使用venid,因为它被查询为常量.因此我会像这样创建和索引:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time);

使用此索引,完成查询所需的所有信息都在索引中.这意味着,希望存储引擎能够获取信息而无需在表内部实际查找.但是,MyISAM可能无法执行此操作,因为它不会将数据存储在索引的叶子中,因此您可能无法获得所需的速度增加.如果是这种情况,请尝试创建表的副本,并在副本上使用InnoDB引擎.在那里重复相同的步骤,看看你是否有显着的速度提升.InnoDB 确实将字段值存储在索引叶子中,并允许覆盖索引.

现在,希望您在解释查询时看到以下内容:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date;

id  select_type table  type  possible_keys        key       [..]  Extra
1   SIMPLE   events range date_idx, indexNameHere indexNameHere   Using index, Using where


+1:覆盖索引是必不可少的.通过仔细索引和仔细查询,6毫米行没什么大不了的.
真棒!谢谢.我没有意识到我需要用索引覆盖SELECTED字段.我认为只是需要索引的WHERE字段.
对于迟到的回复@JustinKrause(和其他人)感到抱歉,您的评论确实是在最初的问题之后的几年内发表的.在修复索引之后,我相信查询时间不到0.4秒.令人惊讶的是它的速度有多快,而且它也不在专用服务器上.它是一个中等大小的托管盒,当时没什么大不了的.我不记得它是不是linode还是我不久之后切换到了linode.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有