如何索引MySQL中的查找表

时间:2010-10-03 06:39:03

标签: mysql indexing performance innodb b-tree

我有一个10M行表product,其中包含color (int), price (float), weight (float), unitprice (int),等字段...现在,来自Web的用户动态生成查询,以便使用随机条件从此表中查找数据(颜色必须在这里)和订购 - 如

select * from product where color=1 and price >5 and price <220 and .... order by unitprice limit 75, 25;

select count(*) from product where color=3 and weight <500 and price <30 ... ;

如何在MySQL中使用大约10个可能的过滤字段(带范围,排序......)索引表(InnoDB或NDB)?


编辑:在我的理解中,MySQL很可能只为查询选择一个索引,只有复合索引的左手部分才有效。显然,索引所有可能的组合并不是一个可行的选择,例如(color, price, weight, create_date, unitprice, ....),(color, weight, price, create_date, unitprice, ....)(color, unitprice, weight, ....) ....并非所有条件都必须存在于所有查询中。

您将如何为此表编制索引?

2 个答案:

答案 0 :(得分:1)

如果要在任何字段上快速查找/过滤/排序,则必须在所有字段上放置索引。

如果必须具有颜色(即在每个查询中使用),则最好在(color, field)上为每个field制作复合索引。

如果(color, product_id)确实是每个常见查询的一部分,那么将聚集索引置于color上也可能值得一试。

答案 1 :(得分:0)

正如Tomalak已经回答的那样,您可能应该为所有字段(以及复合索引,根据您的查询)添加索引。但当然这可能会减慢写作速度。

如果您不确定如何使用索引,可以使用explain命令。