调整对索引的查询

时间:2013-12-23 16:37:53

标签: mysql

我有这张桌子

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,我可以将其删除以加快插入和更新。

有些东西告诉我,我必须犯这个错误,它似乎有点牵强......

我错过了什么?

非常感谢。

2 个答案:

答案 0 :(得分:0)

索引A(类型,类别,子类别)可用于加速查询,如

select * from table where type = x and category = y

因此您可以安全地删除B并且不会重写查询。索引A也可以像索引C(类型)一样,但不能作为索引D(类别)。

答案 1 :(得分:0)

灰色是对的。查看MySQL manual

  

如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(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