我需要在一个包含大约 6 亿行的现有表上插入一个新的两字段索引。该表包含大约一年内积累的数据,每天大约添加 200 万行新行。
\n\n我知道一次性向一个非常大的表添加新索引需要很长时间,因此为了节省时间,我首先使用以下命令仅对最后几天的数据建立索引\xe2\x80\xa6
\n\nCREATE INDEX idx_001\nON message (deviceNumber, messageTime)\nWHERE messageTime >='07-May-2018 00:00:00' ;\n
Run Code Online (Sandbox Code Playgroud)\n\n一天索引大约需要 3 小时,即大约 40 分钟。
\n\n理想情况下,我\xe2\x80\x99d 喜欢对整个表建立索引,但如果一天的数据需要 40 分钟,一次性完成将需要一周以上的时间。
\n\n我想我可以创建很多小索引,每个索引用于几天的数据,也许像这样\xe2\x80\xa6
\n\nCREATE INDEX idx_002\nON message (deviceNumber, messageTime)\nWHERE messageTime <'07-May-2018 00:00:00' AND messageTime >='01-May-2018 00:00:00' ;\n
Run Code Online (Sandbox Code Playgroud)\n\n但我\xe2\x80\x99d 更喜欢坚持使用一个索引。有没有办法改变现有索引的 where 子句来增加覆盖天数?或者我必须创建很多小索引吗?
\npg_catalog
我了解和之间的高级差异information_schema
。
但在许多情况下,工具可以选择使用其中任何一个。我想知道是否存在性能原因导致我们应该选择其中之一。其中之一的查询预计会更快吗?它们在锁方面的工作方式相同吗?
实证测试表明,在 InnoDB 表上进行这样的查询:
SELECT indexed_column FROM tab ORDER BY indexes_column ASC;
Run Code Online (Sandbox Code Playgroud)
比ORDER BY ... DESC
. 为什么会这样?
注意:我使用 MySQL 5.7 和 5.6 进行了测试。所以这与 8.0 中的升序索引无关。