索引的设计原则
索引
的设计可以遵循一些已有的原则,创建索引的时候应尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。
1. 唯一性索引
唯一性索引
的值是唯一的
。
- 可以更快速的通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段
。为该字段建立唯一性索引可以很快的确定某个学生的信息。
如果使用姓名的话,可能存在同名现象,从而降低查询速度。
2. 排序、分组和联合操作的字段
ORDER BY
、GROUP BY
、DISTINCT
和 UNION
等操作的字段,排序操作会浪费很多时间。
- 如果为其建立索引,可以有效地避免排序操作。
3. 条件频率高查询条件的字段
如果某个字段经常用来做查询条件
,那么该字段的查询速度会影响整个表的查询速度。
- 因此,为这样的字段建立索引,可以提高整个表的查询速度。
注意:常查询条件的字段不一定是所要选择的列。
换句话说:
- 最适合索引的列是出现在 WHERE 子句中的列
- 或连接子句中指定的列
- 而不是出现在 SELECT 关键字后的选择列表中的列。
4. 限制索引的数目
索引的数目不是“越多越好”。
- 每个索引都需要占用磁盘空间,
索引越多,需要的磁盘空间就越大
。 在修改表的内容时,索引必须进行更新,有时还可能需要重构。
- 因此,索引越多,更新表的时间就越长。
- 如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。
- 此外,MySQL 在生成一个执行计划时,要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的工作。
- 索引太多,也可能会使 MySQL 选择不到所要使用的最佳索引。
5. 尽量使用数据量少的索引
如果索引的值很长
,那么查询的速度会受到影响
。
例如,对一个 CHAR(100) 类型的字段进行全文检索需要的时间肯定要比对 CHAR(10) 类型的字段需要的时间要多。
6. 数据量小的表最好不要使用索引
- 由于
数据较小
,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果
。
7. 尽量使用前缀来索引
- 如果
索引字段的值很长
,最好使用值的前缀来索引
。
例如,TEXT 和 BLOG 类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
8. 删除不再使用或者很少使用的索引
表中的数据被大量更新
, 应该定期找出这些索引,将它们删除。或者数据的使用方式被改变后,原有的一些索引可能不再需要
, 应该定期找出这些索引,将它们删除。- 从而减少索引对更新操作的影响。
总结
选择索引的最终目的是为了使查询的速度变快,上面给出的原则是最基本的准则,但不能只拘泥于上面的准则。
- 应该在学习和工作中不断的实践。
- 根据应用的实际情况进行分析和判断。
- 选择最合适的索引方式。