【发布时间】:2026-02-15 11:45:01
【问题描述】:
我想通过多个属性的组合来搜索我的 MYSQL 数据库表,我想索引它。例如,如果这是我的桌子:
+----+--------+--------+--------+--------+
| id | field1 | field2 | field3 | field4 |
+----+--------+--------+--------+--------+
| | | | | |
我想运行这样的查询:
select * from table where field1=value1 and field2=value2;
select * from table where field3=value3 and field4=value4;
select * from table where field1=value1 and field2=value2 and field3=value3;
select * from table where field4=value4;
为类似的东西创建索引的最佳方法是什么?
CREATE INDEX my_index on table(field1, field2, field3, field4);
或类似的东西:
CREATE INDEX my_index1 on table(field1);
CREATE INDEX my_index2 on table(field2);
CREATE INDEX my_index3 on table(field3);
CREATE INDEX my_index4 on table(field4);
还是完全不同的东西?
【问题讨论】:
-
我想说的每个字段的索引
-
这个问题非常笼统,因此很难回答。作为一般经验法则,您应该根据要运行的查询、运行它们的频率以及它们对工作负载的影响来索引列。您甚至可以添加一些仅用于索引目的的列,没有语义价值。您还应该考虑到数据库和查询结构的未来变化。
-
"我会说的每个字段的索引" @krishKM 不,这将被称为 index shot gunning 或 index shotgun
-
要添加到@Pyromonk 索引选择性也很重要,您应该知道优化器是基于成本的。如果需要或需要检查表中的 90%,MySQL 不使用索引。 . 事实上,使用索引会比全表扫描更昂贵.. 更多随机磁盘 I/O 请求与一个随机磁盘 I/O 请求和“流”(读取)完整表并过滤掉您的记录不需要在
EXPLAIN输出中的额外列中使用“使用位置”将表明这一点。 -
您在 every 过滤器中是否使用了任何列?有没有你不经常使用的?每列的数据熵如何?