假设产品最多可以有五(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),对吧?
答案 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