在order by子句中具有可为空的索引列是否会影响MySQL查询性能?

时间:2018-08-15 19:53:23

标签: mysql indexing database-performance

我有一个包含一百万行的表和一个执行良好的选择查询,直到我不得不进行模式更改以使order by子句中使用的列接受空值为止。该列始终被索引。唯一的变化是它现在允许空值。

进行更改后,查询性能显着下降,导致相同流量的CPU出现30倍的峰值。

order by子句中只有一列。类似于order by id desc,其中id是一个无符号的bigint并被索引,默认为NULL

删除该列上的索引可以解决此问题,但我无法理解其根本原因。我

你知道会发生什么吗?

1 个答案:

答案 0 :(得分:0)

  

在order by子句中是否具有可为空的索引列会影响   MySQL查询性能?

是的。

  

如果可能,将列声明为NOT NULL。它使SQL操作   通过更好地使用索引并消除开销来提高速度   测试每个值是否为NULL。您还可以节省一些存储空间,   每列一位。如果您的表中确实需要NULL值,请使用   他们。请避免使用默认设置,该默认设置允许每个   列

来源https://dev.mysql.com/doc/refman/5.5/en/data-size.html