Mysql 对于一组历史记录,什么是性能最好的表索引?
我有一个简单的历史表,我正在开发一个新的查找。我想知道什么是最好的索引(如果有的话)添加到这个表,以便查找尽可能快 历史记录表是一组简单的操作记录。每个操作都有一个类型和一个操作日期(以及一些其他属性)。每天系统都会生成一组新的操作记录 相关的伪模式是:Mysql 对于一组历史记录,什么是性能最好的表索引?,mysql,sql,performance,indexing,Mysql,Sql,Performance,Indexing,我有一个简单的历史表,我正在开发一个新的查找。我想知道什么是最好的索引(如果有的话)添加到这个表,以便查找尽可能快 历史记录表是一组简单的操作记录。每个操作都有一个类型和一个操作日期(以及一些其他属性)。每天系统都会生成一组新的操作记录 相关的伪模式是: TABLE history id int, type int, action_date date ... INDEX id ... 注意:该表未按类型或操作日期编制索引 新的查找功能旨在检索在特
TABLE history
id int,
type int,
action_date date
...
INDEX
id
...
注意:该表未按类型
或操作日期
编制索引
新的查找功能旨在检索在特定操作日期发生的特定类型的所有记录
我最初倾向于定义一个由类型
和操作日期
组成的复合键
然而,在我的案例中,将有许多相同类型和日期的操作。此外,每天的行动数量将大致均匀分布
鉴于上述所有情况:(a)是否值得建立一个指数;(b)如果是,首选指数是什么
我使用的是MySQL,但我认为我的问题并不特定于此RDBMS。索引上的第一个字段应该是在应用条件后,为大多数查询提供最小数据集的字段 根据您的业务需求,您可以请求特定日期或特定日期范围(最有可能是日期范围)。因此,日期应该是索引上的最后一个字段。最有可能的是,您将始终具有日期条件
一个常见的答案是拥有(type,Dead)索引,但是如果你在查询中查询了不止一个类型值或者如果只有几个类型(比如小于5)并且它们不均匀分布,则应该只考虑日期索引。 例如,您有表格70%的类型1,类型2,3,4,。。。不到表的百分之几,并且您经常查询类型1,您最好只使用单独的日期索引和类型索引(对于查询类型2、3、4的情况),而不是复合(类型、日期)索引。
索引(类型、操作日期)
,而不考虑任何列的基数或分布。这样做将最大限度地减少索引的BTree`中需要查看的'行'数量。(是的,我不同意塞尔吉的回答。)
即使对于中的键入(2,3)和操作日期…
也可以使用该索引
对于检查日期范围(例如2周),我建议使用以下模式:
AND action_date >= '2016-10-16`
AND action_date < '2016-10-16` + INTERVAL 2 WEEK
显示的数字将让您感觉需要触摸多少索引(或数据)行。这样就可以很容易地看出两个可能的查询/索引中哪一个工作得更好,即使表太小,无法获得可靠的计时。是的,索引是值得的。尤其是搜索表的一小部分时 如果您的搜索将匹配表的20%或更多(大约),MySQL优化器会认为索引比它的价值更麻烦,即使索引可用,它也会进行表扫描 如果搜索一个特定的
type
值和一个特定的date
值,则在(type,date)上建立索引或在(date,type)上建立索引是一个不错的选择。首先列出哪一列并不重要
如果搜索多个类型值或多个日期值,则列的顺序很重要。请遵循以下指南:
- 索引最左边的列应该是进行相等比较的列。相等比较是与一个值完全匹配的比较(即使在多行中找到该值)
- 索引的下一列可以是范围比较的一部分。范围比较匹配多个值。例如,
或
或在()
之间=代码>
只有一个这样的列从索引中受益。如果对多列进行范围比较,则只有索引的第一列将使用索引来支持查找。后续列将不得不“艰难地”搜索那些匹配的行WHERE type = 2 AND date > '2016-10-19' -- one equality, one range
- 如果有时在
上使用范围条件,在type
上使用相等条件进行搜索,则需要创建第二个索引date
WHERE type IN (2, 3, 4) AND date = '2016-10-19' -- make index on (date, type)
子句中的术语顺序无关紧要。SQL查询优化器将对此进行计算并重新排序,以匹配索引中定义的正确列WHERE
WHERE type = 2 AND date > '2016-10-19' -- one equality, one range
WHERE type IN (2, 3, 4) AND date > '2016-10-19' -- multiple range
WHERE type IN (2, 3, 4) AND date = '2016-10-19' -- make index on (date, type)