在我探索MySQL及其高级function的过程中,特别是性能优化方面,我碰到了一些非常重要的SQL性能改进特性,我们知道就像“Index”
我进行了一些实验,发现我可以将数据库读取和高级写入function提高20到100倍,只需将附加索引应用于最常用的列之一即可。
自然会出现一个问题,如果这样的性能改进是可行的,那么为什么不build立每个数据库列的索引,而且数据库操作速度要快2到100倍?
显然,这是默认情况下不会发生的原因。
那么,如何知道索引什么时候? 索引的局限性,以及索引过多的情况下,如何影响整个系统的性能。 是索引影响我的数据库读写性能时使用太多?
我使用InnoDB作为主数据库引擎,我的系统运行perl + apache + mysql CPU:Intel(R)Xeon(R)CPU L5520 @ 2.27GHz RAM:8192 MB
自然会出现一个问题,如果这样的性能改进是可行的,那么为什么不build立每个数据库列的索引,而且数据库操作速度要快2到100倍?
首先,索引对所有情况都没有帮助。 如果查询写得不好,索引将无济于事。 索引可能占用相当多的空间,通常比数据本身大很多倍,所以为每一列添加索引都是非常浪费的。
那么,如何知道索引什么时候? 索引的局限性,以及索引过多的情况下,如何影响整个系统的性能。
您的查询确定哪些数据需要编入索引。 EXPLAIN命令可以帮助您了解需要编制索引的索引以及索引如何有效地帮助查询执行。
索引不会帮助错误的查询。 例如,诸如select * from table where col like "%stuff%"或者select * from table where col rlike "ing$"将不会被额外的索引帮助太大。 在这些情况下,您最好调整您的查询,而不是build立索引。
先调整您的查询。 使用EXPLAIN并观察日志中的慢速查询。 一旦确认查询不能再被调整,然后开始添加索引。
索引占用空间,如果更新数据,索引需要重build,这需要花费时间。
您的索引加速search表中。 不是所有的操作!
要知道你需要什么索引,你需要了解你的应用程序,还有一点关于RDBMS的工作原理。
例如:如果你有一个有人的桌子,而且你的应用程序从不search具有特定鞋子尺寸的人,那么你很可能不需要鞋子尺寸的索引。
在MySQL中,有一个用于logging缓慢查询的function,以及不使用索引的查询。 这些可能有助于您帮助规划索引。
除了上面提到的所有build议之外,我还要指出的是,任何看到大量写入活动的表都会对索引造成问题,因为索引过程将持续高速地跟上变化。