新手问题 什么时候需要建立索引?

QueXuQ · 2012年11月13日 · 最后由 woaigithub 回复于 2012年11月14日 · 9002 次阅读

沒有幫資料表加上索引也是常見的效能殺手,作為搜尋條件的資料欄位如果沒有加索引,SQL 查詢的時候就會一筆筆檢查資料表中的所有資料,當資料一多的時候相差的效能就十分巨大。一般來說,以下的欄位都必須記得加上索引:

外部鍵 (Foreign key) 會被排序的欄位 (被放在 order 方法中) 會被查詢的欄位 (被放在 where 方法中) 會被 group 的欄位 (被放在 group 方法中)

按照上面的说法,不就一个表里可能就有很多索引了?索引多了会不好吗? 例如

XX_id
created_at #根据created_at排序
name #会查询name
group  #还有关于group的

我看了实战圣经中是这样的描述的,请问大家都是什么时候加索引,又是怎么加的呢?

我翻译过一个系列《SQLServer 的索引介绍》,是国外的文章。 虽然是介绍 SQLServer 的,但是其中的理念也适用于各种关系数据库,至少基本适用于 MySQL. http://blog.51cto.com/zt/376 原文地址 http://www.sqlservercentral.com/stairway/72399/

#1 楼 @woaigithub 谢谢。看了一遍,发现原来索引是那么复杂的。看来不是想象那么简单。之前一直以为就直接建一个 index 在那就完事了。

这个需要到具体场景具体权衡,但有一点,建索引不能很随意

#3 楼 @tumayun 恩。起初以为不是什么大的问题。现在看来先研究透在加吧。毕竟性能问题没有那么快出现。

写少读多就多建索引,写多读少就少建索引,数据量少就不建索引 查询有字符串头/尾通配或者大于小于就建二叉树索引,无序大量数据可建哈希索引

#5 楼 @luikore 数据量少就不建索引 这个少是怎么定义的呢?

用空间换时间,索引就是空间。

天底下没有免费的午餐,你加了索引,会增加写入和更新的时间。就像一本书放入图书馆,还需要先进行编目,记录名字,书架位置,这是有代价的,还要占存储空间。所以,不用的索引不要加。

#6 楼 @QueXuQ 这是我粗浅笼统的说法... 实际还要测一下...

具体场景在来测试,然后决定建立什么索引,一般一开始不建立索引,最多来个唯一索引,保证数据项的唯一。 在后期不断监控数据库,然后在需要的时候看建立什么索引,再往后还要继续调整,索引也是随着业务变化而变化的,不是一成不变的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号