MySQL - 索引中有很多列?还是一个接一个?

时间:2011-01-13 18:53:10

标签: sql mysql indexing

假设产品最多可以有五(5)个投诉。在这种情况下,有一个包含五(5)列的表。这五个列直接涉及另一个表,其中报告声明代码。

见:http://img263.imageshack.us/img263/4990/01mysql.jpg

从这一刻起,我必须在两个表之间建立关系。那么以下哪一项更适合创建索引:

a)逐个创建索引?

ALTER TABLE `complaint` ADD INDEX (`code_01`) 
ALTER TABLE `complaint` ADD INDEX (`code_02`) 
ALTER TABLE `complaint` ADD INDEX (`code_03`) 
ALTER TABLE `complaint` ADD INDEX (`code_04`) 
ALTER TABLE `complaint` ADD INDEX (`code_05`) 

b)单个索引中的所有字段?

ALTER TABLE `complaint` ADD INDEX (`code_01`, 
                                   `code_02`, 
                                   `code_03`, 
                                   `code_04`, 
                                   `code_05`)

我认为最好的选择是a),因为如果我选择选项b)并通过访问phpMyAdmin中的“Relation View”,它会显示还有其他字段说“没有定义索引!”在列code_02,code_03和code_04 code_05。


注意 - 插入和更新:

如果我使用选项b)并在列号为code_02,code_03和code_04 code_05的记录中输入代码,则MySQL不会建议输入的代码不存在的任何错误。仅返回应该确实不正确的成功消息。所以在这种特殊情况下,我必须使用选项a),对吧?

4 个答案:

答案 0 :(得分:4)

如果您有多个列的索引,则只有在最左侧列访问时才会使用索引。

选项a将创建5个单独的索引,选项B将只创建1个

如果您要按任何列进行搜索或排序,则必须使用选项A. 但是,如果要按索引顺序按列搜索,则使用选项B

实施例

SELECT ID
FROM table
WHERE code_03 = 'asd' OR code_02 = 'asds'

使用选项A

SELECT ID
FROM table
WHERE code_01 = 'asd' AND code_02 = 'asds'

使用选项B

如果可以,请使用选项B,因为它可以产生更好的性能,因为它可以使用单个索引来搜索多个列。而且指数会更小。

答案 1 :(得分:1)

这取决于您的疑问!

请阅读:

http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-combine-performance

您可能需要从该页面阅读更多内容。

答案 2 :(得分:0)

如果可以,请将您的设计标准化。从Complaint表中获取这5个代码列,并在Complaints和code_complaint之间创建联结表,以正确处理多对多关系。

作为一般规则,每当您开始对列名称(code_01,code_02 ...)进行编号时,这应该是一个红色标记,您的设计需要进一步规范化。

答案 3 :(得分:0)

忽略许多人希望这是一个多对多表的事实,我假设你要加入到每个领域的投诉记录 e.g

Products
inner join product_complaint pc
ON p.pid = pc.pid
LEFT JOIN complaints c1
ON pc.code_01 = c1.c_id
LEFT JOIN complaints c2
ON pc.code_02 = c2.c_id
LEFT JOIN complaints c3
ON pc.code_03 = c3.c_id
LEFT JOIN complaints c4
ON pc.code_04 = c4.c_id
LEFT JOIN complaints c5
ON pc.code_05 = c5.c_id

在这种情况下,请使用选项1。

但这两个选项是互斥的,因此如果确定你需要它,你也可以选择2