我有这张桌子
type smallint(6)
category smallint(6)
subcategory smallint(6)
name varchar(175)
有时我需要执行此查询:
select * from table where type = x and category = y and subcategory = z
其他时候,我需要执行这个:
select * from table where type = x and category = y
所以,我创建了两个索引,所以查询运行得非常快(因为表有百万行)
alter table table add index A (type,category,subcategory);
alter table table add index B (type,category);
我的问题是,为了加快“更新”,“插入”等,我可以删除第二个索引,并将第二个查询更改为:
select * from table where type = x and category = y and subcategory >= 0
这样,该查询将使用索引A以及第一个查询。不会使用索引B,我可以将其删除以加快插入和更新。
有些东西告诉我,我必须犯这个错误,它似乎有点牵强......
我错过了什么?
非常感谢。
答案 0 :(得分:0)
索引A(类型,类别,子类别)可用于加速查询,如
select * from table where type = x and category = y
因此您可以安全地删除B并且不会重写查询。索引A也可以像索引C(类型)一样,但不能作为索引D(类别)。
答案 1 :(得分:0)
如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上建立索引搜索功能。
您不需要两个示例索引A和B.如果您的查询中需要这样的索引顺序,则需要index X (category, subcategory)
或index Y (type, subcategory)
之类的内容。
使用index A (type,category,subcategory)
覆盖两个示例查询(第二个查询不需要subcaterory >= 0
部分,只需将其保留)并查询:select * from table where type = x
。