这个在我脑海里已经有一段时间了。我有一个读取量很大的数据库,一个特定的表几乎每一列都有一个索引。这些索引并不浪费,我已尽力调整我的查询以使用现有索引,这样就不需要新的索引了。
但是,在我对查询和索引进行了最佳优化之后,我的桌子上似乎还有很多。
我想出的减少索引的唯一真正解决方案是将一些信息(其中很多是重复的或相似的)存储在具有自己索引的不同表中。
我会有几个索引很少的表,而不是一个有多个索引的表。
问题是,我学到的两个 mysql 实践是相互冲突的:
- 您永远不应该在多个表中存储重复的信息。只存储一次的数据是干净和高效的。
- 您不应该在表的每一列上都有索引。这实际上会减慢查询速度,因为 mysql 引擎必须检查每个索引以查看是否可以使用。
以上两点不是“官方的”,我只是引用我过去学到的东西。
那么哪个“最佳实践”是“更好”的实践呢?哪个更重要?
编辑:希望一个例子能帮助说明我的意思。
假设我有两个用户 Bob (user_id 10) 和 jack (user_id 5)。用户想知道他们从支付表中“赚”了多少。
对于鲍勃:SELECT SUM(amount) FROM payments WHERE user_id=10
由于这个查询对每个用户都运行了很多,所以在user_id
列上创建了一个索引,这使得这个查询闪电般快速。
用户还可以获得 5% 的推荐收入。Jack 是 Bob 的推荐人,因此他获得了 5% 的付款。
Bob的推荐收入:SELECT (SUM(amount)*.05) FROM payments WHERE referral_id=10
注意:由于多个用户可以是 Bob 的推荐人,我不能使用该user_id
列。
所以,我有两个选择:我可以添加另一个索引,referral_id
或者我可以创建另一个表“referral_payments”,该表将存储具有类似信息的另一行。该表将有一个索引referral_id.
将这个时间复制 10 次,您就会遇到这样的情况,即我需要开始创建新表,或者即使已经有很多索引,也需要继续创建新索引。