我在这里有三个列:year,pid(整数)和代码(varchar)。想要为每个人编制索引。哪个更好(我正在使用postgres,但我对系统一般感到好奇):在每三列上全部CREATE INDEX myidx ON mytable USING btree (year, pid, code);
或转btree
个别索引?
这两种方法的含义是什么?
答案 0 :(得分:2)
不要在随机列上创建索引,始终根据您使用表的方式创建索引。即如果您将使用SELECT ... WHERE year = 2011 AND pid = 2
之类的查询,请在(年,pid)上创建索引。索引允许您更有效地执行某些查询,但它也会占用磁盘空间并使插入更慢。
通过阅读3 ways MySQL uses indexes和Indexes in MySQL(两篇简短的博客文章解释MySQL如何处理索引),您可以大致了解哪些索引是好的。请记住,每个DBMS的工作方式都有所不同。
哪个更好
唯一有效的答案是 - 它取决于(根据您的使用场景,存储数据量,列选择性等)。
答案 1 :(得分:2)
它们之间的区别如下。假设您有A,B,C列,并且按照这个顺序在它们上放置一个复杂的索引。现在,当你做的时候
SELECT * from table where A = .. AND B = .. AND C =
然后将使用索引,这是该索引的最有效用法。
如果您有查询
SELECT * from table where A = ..
然后仍然会使用索引。但是,idnex不会(由于评论更新:或仅部分用于第2和第3个示例)用于:
SELECT * from table where B ..
SELECT * from table where A = .. AND C = .. AND B = ..
SELECT * from table where A = .. AND C = ..
然而,将再次用于:
SELECT * from table where A = .. AND B = ..
希望这会有所帮助。订单是这里的KEY。当然还有你需要的。如果你有三个问题,比如
SELECT * ... where A
SELECT * ... where B
SELECT * ... where C
然后当然在单列上制作3个索引。但是如果你有AND的查询,首先要确保他们有相同的顺序,然后继续为3列制作1个索引