Mysql 索引设计的原则mysql
索引设计的原则?
1.适合索引的列是出如今where子句中的列,或者链接子句中指定的列
2.基数较小的类,索引效果较差,没有必要在此列创建索引
3.使用短索引,若是对长字符串列进行索引,应该指定一个前缀长度,这样可以节省大量索引空间
4.不要过分索引。索引须要额外的磁盘空间,并下降写操做的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。因此只保持须要的索引有利于查询便可。
2. 建立索引的原则(重中之重)
索引虽好,但也不是无限制的使用,最好符合一下几个原则sql
1) 最左前缀匹配原则,组合索引很是重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就中止匹配,好比a = 1 and b = 2 and c > 3 and d = 4 若是创建(a,b,c,d)顺序的索引,d是用不到索引的,若是创建(a,b,d,c)的索引则均可以用到,a,b,d的顺序能够任意调整。数据库
2)较频繁做为查询条件的字段才去建立索引ide
3)更新频繁字段不适合建立索引函数
4)如果不能有效区分数据的列不适合作索引列(如性别,男女未知,最多也就三种,区分度实在过低)性能
5)尽可能的扩展索引,不要新建索引。好比表中已经有a的索引,如今要加(a,b)的索引,那么只须要修改原来的索引便可。优化
6)定义有外键的数据列必定要创建索引。设计
7)对于那些查询中不多涉及的列,重复值比较多的列不要创建索引。索引
8)对于定义为text、image和bit的数据类型的列不要创建索引。事务
3。 建立索引时须要注意什么?
非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,由于它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;
取值离散大的字段:(变量各个取值之间的差别程度)的列放到联合索引的前面,能够经过count()函数查看字段的差别值,返回值越大说明字段的惟一值越多字段的离散程度高;
索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操做获取的数据越大效率越高。
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
4.什么是脏读?幻读?不可重复读?
脏读(Drity Read):某个事务已更新一份数据,另外一个事务在此时读取了同一份数据,因为某些缘由,前一个RollBack了操做,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这多是两次查询过程当中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例若有一个事务查询了几列(Row)数据,而另外一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
5.死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而致使恶性循环的现象