索引表中的每一列

时间:2010-07-09 08:40:03

标签: mysql indexing memory-table

关于MySQL索引,我有几个问题:

1)索引存储在内存中的表时是否有任何速度提升?

2)在搜索我的表时,我在列字段上匹配,是否会将每列索引化为索引的目的?

非常感谢。

4 个答案:

答案 0 :(得分:20)

对基于内存或文件系统的任何表建立索引,将加快基于该列选择或排序结果的查询。这是因为索引的工作方式类似于tree structure,搜索距离取决于树的深度,这比列的行数(对数)增加了很多。

索引每一列并不会破坏索引的目的,但它会减慢插入和更新的速度,因为这些更改将导致更新该表的每个索引。此外,索引会占用数据库服务器上的空间,因此这是另一个需要考虑的缺点。

有关此问题的其他SO问题:

Best practices for indexing
What is an index
How many indexes are enough

答案 1 :(得分:2)

1)是的,当然 2)不,它没有打败索引的目的。请记住,mysql每个表不能使用多于1个索引,并且添加更多索引会降低插入/更新/删除操作的速度。因此,请避免创建未使用的索引,而是创建最符合您查询的多列索引。

答案 2 :(得分:0)

磁盘空间中索引的成本通常很小。在表更改时更新索引的额外写入的成本通常是适中的。额外锁定的成本可能很高。

这取决于表上的读取与写入比率,以及索引实际用于加速查询的频率。

索引占用磁盘空间来存储,并且需要时间来创建和维护。未使用的没有任何好处。如果查询有许多候选索引,则可以通过让服务器为查询选择“错误”索引来减慢查询速度。

使用这些因素来决定是否需要索引。

通常可以创建永远不会被使用的索引 - 例如,只有两个可能值的(非空)字段上的索引几乎肯定是无用的。

您需要解释自己的应用程序的查询,以确保频繁执行的查询在可能的情况下使用合理的索引,并且不要创建比执行此操作所需的索引更多的索引。

您可以通过以下链接获得更多信息:对于mysql:http://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL

对于DB2:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005052.htm

答案 3 :(得分:0)

问题Q1 ...即使存在“完全良好”的索引,查询优化器有时也会选择扫描表。这种权衡基于复杂的算法,但是根据经验:

如果需要使用约20%以上的索引,则忽略索引并简单地扫描表被认为更为有效。

这样做的原因是:使用索引意味着扫描索引BTree(看起来非常像表),然后跳到数据BTree来查找记录。如果仅扫描数据,则可以避免这种反复操作。缺点是它需要忽略多达80%的行。

推论:不要打扰索引“标志”(0/1,T / F,M / F,是/否)或低基数列(是/否/也许,M / F /等,日期周...)。

另一方面,以低基数列开头的 composite 索引可能非常有用:

WHERE deleted=0 AND created_at > NOW() - INTERVAL 1 DAY
INDEX(deleted, created_at)