对于像这样的表
[ col1 - col2 - col3 - col4 ]
[ 1 - 2 - 3 - 4 ]
我将在两种情况下使用两种类型的查询
一个是SELECT * FROM table WHERE col1 = 1 AND col2 = 2 AND col3 = 3;
另一个是SELECT * FROM table WHERE col1 = 1 AND col2 = 2 AND col4 = 4;
在这种情况下,我做一个
composite index
仅适用于col1 AND col2
而single-column index
适用于col3 AND col4
或者我去
ALL
列single-column index
或放
ALL
composite index
附带问题:我必须为索引命名吗?什么是指数大小?
答案 0 :(得分:0)
col1和col2上的复合索引,col3和col4上的单列索引可能最佳。但要确定的方法是构建一个测试表,并用样本数据填充它。如果可能,请在生产中插入大致相同数量的数据。
然后构建索引,运行查询并阅读执行计划。删除索引,以不同的方式构建它们,运行查询,并阅读执行计划。
您还应该考虑其他查询需要使用此表,以及索引如何影响这些查询。考虑INSERT和DELETE查询以及SELECT语句。
是否必须为索引命名取决于dbms。如果你把它留下来,他们中的大多数将提供系统生成的名称。索引的大小取决于dbms;如果dbms没有提供显式函数或存储过程来解决这个问题,通常可以找到它。
答案 1 :(得分:0)
有这两个:
INDEX col123 (col1, col2, col3),
INDEX col214 (col2, col1, col4)
注意:
col2
而没有col1
。INDEX(col3)
(单列)不太有用。INDEX(col1, col2), INDEX(col3)
- 优化器将选择一个索引而不使用另一个索引。这比拥有所有三列的索引要好。INSERTs
确实需要一点时间来更新索引,但大部分工作都会延迟(请参阅"更改缓冲")以获取非UNIQUE索引。不要让它阻止你添加索引。 SELECT
通常的好处远远超过INSERT
中的费用。比较查询和/或索引的另一种方法,即使行数太少也无法获得可靠的时间:
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
大数字=坏;小数字=微笑。