在我探索 MySQL 及其高级特性的过程中,特别是在性能优化方面,我遇到了一些对 SQL 性能改进极其重要的特性,我们大多数人只知道“索引”
我进行了一些实验并发现,只需对最常用的列之一应用额外的索引,就可以将数据库读取和高级写入功能提高 20 到 100 倍。
自然而然地出现了一个问题,如果这样的性能改进是可行的,为什么不为每个数据库列设置索引,并让数据库操作速度提高 2 到 100 倍呢?
显然,默认情况下不会发生这种情况是有原因的。
那么,如何知道什么时候索引什么?索引的局限性是什么?如果我过度索引,会如何影响我的整体系统性能。 索引使用过多是否会影响数据库的读写性能?
我使用 InnoDB 作为我的主要数据库引擎,我的系统运行 perl + apache + mysql CPU:Intel(R) Xeon(R) CPU L5520 @ 2.27GHz RAM:8192 MB
答案1
自然而然地出现了一个问题,如果这样的性能改进是可行的,为什么不为每个数据库列设置索引,并让数据库操作速度提高 2 到 100 倍呢?
首先,索引并非在所有情况下都有用。如果查询写得不好,索引也起不到任何作用。索引会占用大量空间,通常比数据本身大很多倍,因此为每一列添加索引会非常浪费。
那么,如何知道什么时候索引什么?索引的局限性是什么?如果我过度索引,会如何影响我的整体系统性能。
您的查询决定了哪些数据需要索引。该EXPLAIN
命令将帮助您了解哪些数据需要索引以及索引对查询执行的帮助有多大。
索引不会对不良查询有所帮助。例如,诸如select * from table where col like "%stuff%"
或之类的查询select * from table where col rlike "ing$"
不会因额外的索引而得到很大帮助。在这些情况下,您最好调整查询而不是索引。
首先调整您的查询。使用EXPLAIN
并观察日志以查找慢速查询。一旦您确认查询无法再调整,就可以开始添加索引。
答案2
索引需要空间,如果您更新数据,则需要重建索引,这需要时间。
索引可以加快表中的搜索速度。全部运营!
要了解您需要什么索引,您需要了解您的应用程序,还需要了解一些 RDBMS 的工作原理。
例子:如果您有一张桌子上有人,而您的应用程序从不搜索具有特定鞋码的人,那么您很可能不需要鞋码索引。
在 MySQL 中,有一个用于记录慢查询和不使用索引的查询的功能。这些可能有助于您规划索引。
答案3
除了上述所有非常好的建议之外,我想指出的是,任何出现大量写入活动的表在索引方面都会有问题,因为索引过程将持续运行以跟上变化。