简单的INDEX查询表现糟糕

时间:2018-05-25 17:54:09

标签: mysql sql

我在带有55GB innodb缓冲区的数据库上运行它。 该服务器在亚马逊上具有EBS 7000 IOPS SSD性能,因此效果非常好。

该表是190 GB的数据和116 GB的总索引。

查询在索引的varchar列上运行:

 Query   14246   Sending data    select count(*) from profile WHERE name is not null

要将整个表数据复制到新位置,大约需要30分钟。 但是一个简单的索引计数需要HOURS。

Mysql:Distrib 5.5.42 我无法升级,总共我有2 TB的数据库存储和升级需要它全部导出并再次读入,所以我被锁定了那个mysql版本。

解释结果:

1       SIMPLE  profile        NULL    range   name    name    771     NULL    153588811       100.00  Using where; Using index

这种可怕的表现怎么办? 我原本预计可能需要5分钟,而不是5个小时......

2 个答案:

答案 0 :(得分:1)

我不知道有多少行有 name = NULL 。因此大多数时候使用无索引要快得多。如果MySQL使用索引,则按索引的顺序处理行。所以这就是MySQL经常必须读取另一个块以获得下一个ROW的原因。这需要很长时间。

尝试这样的查询,读取所有行,但在光盘上的物理oder

r11

请让我知道它会生效。

答案 1 :(得分:-1)

请尝试:

 select count(name) from profile;  

**编辑:count(name)计数name不是Null的行。如果没有WHERE子句,此查询可能会更快,然后问题中的原始查询 我没有用5.5.42和大表来测试它的速度。