我有一个包含超过一百万行的表和一个执行良好的select查询,直到我不得不进行模式更改,使order by子句中使用的列接受空值。该列一直被编入索引。唯一的变化是它现在允许空值。
进行更改后,查询性能显著下降,导致相同流量的CPU峰值增加了30倍。
order by子句中只有一列。类似于order by id desc,其中id是一个无符号的大整数,并被索引并缺省为NULL。
删除这个列上的索引可以解决这个问题,但是我还不能理解导致这个问题的根本原因。我
知道可能发生了什么吗?
发布于 2018-08-16 04:11:04
在order by子句中有一个可以为空的索引列是否会影响MySQL查询性能?
是的,确实如此。
如果可能,
将列声明为非NULL。它可以更好地使用索引,并消除测试每个值是否为NULL的开销,从而使SQL操作更快。您还可以节省一些存储空间,每列一位。如果您确实需要在表中使用空值,请使用它们。只需避免在每一列中都允许空值的缺省设置
https://stackoverflow.com/questions/51865533
复制相似问题