我在带有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个小时......
答案 0 :(得分:1)
我不知道有多少行有 name = NULL 。因此大多数时候使用无索引要快得多。如果MySQL使用索引,则按索引的顺序处理行。所以这就是MySQL经常必须读取另一个块以获得下一个ROW的原因。这需要很长时间。
尝试这样的查询,读取所有行,但在光盘上的物理oder
r11
请让我知道它会生效。
答案 1 :(得分:-1)
请尝试:
select count(name) from profile;
**编辑:count(name)计数name不是Null的行。如果没有WHERE子句,此查询可能会更快,然后问题中的原始查询 我没有用5.5.42和大表来测试它的速度。