我有一个包含一百万行的表和一个执行良好的选择查询,直到我不得不进行模式更改以使order by子句中使用的列接受空值为止。该列始终被索引。唯一的变化是它现在允许空值。
进行更改后,查询性能显着下降,导致相同流量的CPU出现30倍的峰值。
order by子句中只有一列。类似于order by id desc
,其中id是一个无符号的bigint并被索引,默认为NULL
。
删除该列上的索引可以解决此问题,但我无法理解其根本原因。我
你知道会发生什么吗?
答案 0 :(得分:0)
在order by子句中是否具有可为空的索引列会影响 MySQL查询性能?
是的。
如果可能,将列声明为NOT NULL。它使SQL操作 通过更好地使用索引并消除开销来提高速度 测试每个值是否为NULL。您还可以节省一些存储空间, 每列一位。如果您的表中确实需要NULL值,请使用 他们。请避免使用默认设置,该默认设置允许每个 列