我第一次使用数据库中的索引,到目前为止我已经了解到,如果您有索引('col1','col2','col3')等多列索引, ,如果你做了一个使用col2 ='col2'和col3 ='col3'的查询,那么该索引就不会被使用。db2 10.5多列索引解释
我还了解到,如果一列色谱柱的选择性非常低。索引是无用的。 但是,从我的测试来看,上述情况似乎都不是真的。有人能解释更多吗?
我有一个超过1600万条记录的表格。假设claimID是主键,那么有一个historynumber列只有3个不同的值(1,2,3),而storeNumber的最后一列有大约100万个不同的值。
我有一个唯一的claimID索引,另一个索引(historynumber,claimID)和索引(historynumber,storeNumber)和最后索引(storeNumber,historynumber)的其他索引。
我的猜测是,如果我做的:
select * from my_table where claimId='123456' and historynumber = 1
会比
select * from my_table where historynumber = 1 and claimId = '123456'
但是快得多,2具有完全相同的性能(即时)。所以我认为主键索引可以在任何列顺序上工作。因此,我尝试了相同的事情,只是在historynumber和storeNumber上进行。结果完全一样。然后我开始尝试没有索引的列,当然结果也是一样的。
最后,我做了
select * from my_table where historynumber = 1
和查询需要很长时间,我不得不取消它。
所以我的结论是where子句中的列顺序是完全无用的,索引定义中的列顺序也是如此,因为看起来数据库足够聪明,可以告诉哪个列是最高选择性列。
有人能给我一个可以证明的例子吗?
嘿,感谢回答。第二个查询不是问题。我只是确保historynumber = 1的查询需要很长时间而不是立即执行,否则我的其他测试会失败。我今天做了很多研究,所有人都表示这个订单会有所作为。我无法找到我今天阅读的所有链接,但这里有一些情况如此: [link1](http://stackoverflow.com/questions/179085/multiple-indexes-vs-multi-column - 指数) [链接2](http://stackoverflow.com/questions/5542895/sql-indexes-and-performance-improvement) – user3758745
那么缺少什么?否则,我的答案恰恰恰到好处? – MichaelTiefenbacher
这些链接正在讨论MS SQL Server。索引的使用通常是DBMS特有的。在DB2上,'WHERE'中的顺序并不重要...并且在DB2上我至少建议最有选择性的列首先在索引中。同样在DB2 for i上,'historynumber = 1'查询可能使用全表扫描,因为查询引擎可能会确定超过30%的行将被返回。 – Charles