关于MySQL索引,我有几个问题:
1)索引存储在内存中的表时是否有任何速度提升?
2)在搜索我的表时,我在列字段上匹配,是否会将每列索引化为索引的目的?
非常感谢。
答案 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
答案 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)