Mysql索引分析:适合建索引?不适合建索引?【转】

数据库创建索引经常使用的规则以下: 
一、表的主键、外键必须有索引; 
二、数据量超过300的表应该有索引; 
三、常常与其余表进行链接的表,在链接字段上应该创建索引; 
四、常常出如今Where子句中的字段,特别是大表的字段,应该创建索引; 
五、索引应该建在选择性高的字段上; 
六、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 
七、复合索引的创建须要进行仔细分析;尽可能考虑用单字段索引代替: 
  A、正确选择复合索引中的主列字段,通常是选择性较好的字段; 
  B、复合索引的几个字段是否常常同时以AND方式出如今Where子句中?单字段查询是否 
     极少甚至没有?若是是,则能够创建复合索引;不然考虑单字段索引; 
  C、若是复合索引中包含的字段常常单独出如今Where子句中,则分解为多个单字段索引; 
  D、若是复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减小复合的字段; 
  E、若是既有单字段索引,又有这几个字段上的复合索引,通常能够删除复合索引; 
八、频繁进行数据操做的表,不要创建太多的索引; 
九、删除无用的索引,避免对执行计划形成负面影响; 
以上是一些广泛的创建索引时的判断依据。
  索引的创建必须慎重,对每一个索引的必要性都应该通过仔细分析,要有创建的依据。
   由于太多的索引与不充分、不正确的索引对性能都毫无益处:在表上创建的每一个索引都会增长存储开销,索引对于插入、删除、更新操做也会增长处理上的开销。 另外,过多的复合索引,在有单字段索引的状况下,通常都是没有存在价值的;相反,还会下降数据增长删除时的性能,特别是对频繁更新的表来讲,负面影响更大。 
    总的来讲,小型表确定不建索引,
  或者数据库记录在亿条数据级以上,仍是建议使用非关系型数据库。
  还有些特殊字段的数据库,好比BLOB,CLOB字段确定也不适合建索引。
  其实这个问题更感受偏向于作软件项目的一种经验。


对千万级MySQL数据库创建索引的事项及提升性能的手段

1、注意事项:
首先,应当考虑表空间和磁盘空间是否足够。咱们知道索引也是一种数据,在创建索引的时候势必也会占用大量表空间。所以在对一大表创建索引的时候首先应当考虑的是空间容量问题。
其次,在对创建索引的时候要对表进行加锁,所以应当注意操做在业务空闲的时候进行。
2、性能调整方面:
首当其冲的考虑因素即是磁盘I/O。物理上,应当尽可能把索引与数据分散到不一样的磁盘上(不考虑阵列的状况)。逻辑上,数据表空间与索引表空间分开。这是在建索引时应当遵照的基本准则。
其次,咱们知道,在创建索引的时候要对表进行全表的扫描工做,所以,应当考虑调大初始化参数db_file_multiblock_read_count的值。通常设置为32或更大。

再次,创建索引除了要进行全表扫描外同时还要对数据进行大量的排序操做,所以,应当调整排序区的大小。
    9i以前,能够在session级别上加大sort_area_size的大小,好比设置为100m或者更大。
    9i之后,若是初始化参数workarea_size_policy的值为TRUE,则排序区从pga_aggregate_target里自动分配得到。
最后,创建索引的时候,能够加上nologging选项。以减小在创建索引过程当中产生的大量redo,从而提升执行的速度。mysql

 

MySql在创建索引优化时须要注意的问题

设计好MySql的索引可让你的数据库飞起来,大大的提升数据库效率。设计MySql索引的时候有一下几点注意:1,建立索引对于查询占主要的应用来讲,索引显得尤其重要。不少时候性能问题很简单的就是由于咱们忘了添加索引而形成的,或者说没有添加更为有效的索引致使。若是不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,若是一张表的数据量很大而符合条件的结果又不多,那么不加索引会引发致命的性能降低。可是也不是什么状况都非得建索引不可,好比性别可能就只有两个值,建索引不只没什么优点,还会影响到更新速度,这被称为过分索引。2,复合索引好比有一条语句是这样的:select * from users where area=’beijing’ and age=22;若是咱们是在area和age上分别建立单个索引的话,因为mysql查询每次只能使用一个索引,因此虽然这样已经相对不作索引时全表扫描提升了不少效率,可是若是在area、age两列上建立复合索引的话将带来更高的效率。若是咱们建立了(area, age,salary)的复合索引,那么其实至关于建立了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。所以咱们在建立复合索引时应该将最经常使用做限制条件的列放在最左边,依次递减。3,索引不会包含有NULL值的列只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。因此咱们在数据库设计时不要让字段的默认值为NULL。4,使用短索引对串列进行索引,若是可能应该指定一个前缀长度。例如,若是有一个CHAR(255)的 列,若是在前10 个或20 个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不只能够提升查询速度并且能够节省磁盘空间和I/O操做。5,排序的索引问题mysql查询只使用一个索引,所以若是where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。所以数据库默认排序能够符合要求的状况下不要使用排序操做;尽可能不要包含多个列的排序,若是须要最好给这些列建立复合索引。6,like语句操做通常状况下不鼓励使用like操做,若是非使用不可,如何使用也是一个问题。like “%a%” 不会使用索引而like “aaa%”可使用索引。7,不要在列上进行运算select * from users whereYEAR(adddate)8,尽可能减小使用NOT IN和!=操做NOT IN和!=操做通常都不会使用索引将进行全表扫描
相关文章
相关标签/搜索