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