mysql数据库知识-Mysql索引总结:
索引(Index)是帮助MySQL高效获取数据的数据结构。 下边是自己整理的资料与自己的学习总结,,做一个汇总。
一.真的有必要使用索引吗?
不是每一个性能问题都可以通过创建一个索引来解决;有很多其它解决性能问题的方式
a).各个应用层的缓存,
b).调优数据库参数和缓冲区大小,
c).调优数据库连接池大小或者线程池大小,
d).调整数据库事务隔离级别,
f).在夜间安排批量删除,避免不必要的锁表,
其它等等。
二.mysql索引类型normal,unique,full text的区别
1.PRIMARY, INDEX, UNIQUE 这3种是一类
normal:表示普通索引
unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique,特殊的,主键primary_key默认非空唯一
2.FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
full text: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。
三.索引总结
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。 本小节将向读者介绍一些索引的设计原则。干货呀!
1.选择唯一性,单调性的索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。单调性指的是数字递增或递减,比如ID,这样效率会高(7.mysql-聚簇索引之随机主键的效率.note) 2.为经常需要排序、分组和联合操作的字段建立索引 经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。 4.限制索引的数目 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 5.尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。避免不了,解决方法见6. 6.尽量使用前缀来索引 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。 不错的网络文章参考 :(MySQL前缀索引和索引选择性)
在select中where条件的先后顺序无所谓SQL内核会排序优化,但是建立联合索引时就有所谓了,遵循左前缀原则。5.4 mysql-索引数据结构.note 最后结论
8.删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响
9.索引并不是越多越好,最多6个
索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,
所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
10.emun 的情况或只有个位数级别的字段,没必要加索引
极端点的情况,90万的数据,source只有0和1两个值,利用索引要先读索引文件,然后二分查找,找到对应数据的数据磁盘指针,再根据读到的指针再读磁盘上对应的数据数据,影响结果集45万。这种情况,和直接全表扫描那个快显而易见。
11.索引对group by 有效
本质也是一个排序的过程,而索引帮其实现6 mysql-索引优化策略.note 第三条
不知觉就看着这么多行了,真实一下子也记不住呀,但是仔细想想上边的每一条,在生产运用中还真该这么注意,发现一些问题如果能注意到上边的这么几条,还真有些道理。所以,总结如下: