我想知道,如果我为我的数据库的每个表中的每个字段添加一个索引,那么这会使我的查询运行得更快吗? 或者我是否必须分析我的查询并仅在需要时创建索引?
答案 0 :(得分:3)
在每列上添加索引可能会使您的大多数查询更快,但这不一定是最好的方法。最好将索引调整为特定查询,使用EXPLAIN和性能测量指导您添加正确的索引。
特别需要了解何时不应对列进行索引,何时需要多列索引。
我建议阅读optimization of SELECT statements的MySQL手册,它解释了在什么条件下可以使用索引。
答案 1 :(得分:2)
您拥有的索引越多,插入/更新就越重。所以这是一个权衡。现在无法使用索引的选择查询将更快地进行,但如果您检查您正在加入哪些字段(或在哪里使用),您将无法进行那么多的交易
(当然,还有磁盘空间,但大多数时候我并不关心那个:))
答案 2 :(得分:0)
另一点是,MySql只能为查询使用单个索引,因此如果您的查询是
SELECT * FROM table WHERE status = 1 AND col1='foob' AND col2 = 'bar'
MySql将使用其中一个索引,并过滤掉其余读取表中数据的内容。
如果您有这样的查询,最好在(status, col1, col2)
答案 3 :(得分:-2)
在每个表中的每个字段上添加索引并不聪明。 您应该仅在您在排序的select OR中的WHERE子句中使用的列上添加索引。
通常,使用特定于SQL选择的多列索引可以获得最佳结果。
还有一些部分索引限制字段长度,也可以用来优化性能并减少索引站点。
每个不必要的索引都会在插入过程中减慢数据库的速度,因为在每个插入时,每个索引都必须更新。
您拥有的索引越多,数据损坏的可能性就越大。最后,索引会在磁盘上占用额外的存储空间,有时会占用很多空间。
MySQL也试图将索引保留在内存中。如果你有不必要的索引,那么MySQL会有一个很好的改变,最终会耗尽可用内存和不必要的索引,在这种情况下你的性能会下降很多。
创建正确类型的索引可能是最重要的一种优化技术。这就是为什么当有人问这样的事情时我觉得这是个玩笑。
这个问题只能由没有读过一本关于MySQL的书的人提出。只要得到一本好书并阅读,那么你就不必提出这样的问题了。