第五章 查询优化

5.1使用索引

一、查询优化要点

1.为表创建索引,让数据库服务器查询行的速度更加的快。

2.最大程度使用创建表的索引,并且使用explain检测。

3.创建表示使用能够让数据库服务器高效处理的数据类型和表存储格式。

二、使用索引

1.无索引:一张表没有索引就是一组无序的行,当我们想要某个条件的行时,会对全表进行搜索,效率极低;

2.有索引:将相当于将这张表按照某一关键字进行排序存储。

  搜索:线性扫描:从索引开始位置从上往下搜索,找到符合条件的行,然后跳过其他部分;

     快速定位:(使用二分法快速定位符合条件索引)快速定位第一个符合条件索引值,从而节省大量时间;

 索引和数据是分离的,这样一个表就可以多个索引并且易于管理,当有插入或删除操作的时候,来回移动较短的索引值的速度要快于来回移动数据值。

MYISAM引擎:索引和表数据分开的,索引文件的每一个索引都是由一组有序的关键字组成,这个组关键字主要用于快速访问表的行数据。

InnonDB引擎:只是用一个表空间,这个表空间里面存储着索引和表数据。

在使用单表查询的时候使用索引可以不用全盘扫描全表,可以快速精确定位某一行或多行数据,在多表进行查询的时候,效果更佳。

mysql使用索引的方式:

1.索引可以用户where子句后面可以快速进行行匹配,或多表链接进行行匹配。

2.使用max,或min函数时可以使用索引快速定位。

3.对order by和group by也可以使用索引进行快速的排序和分组操作。

4.mysql也有可能获取的数据即是索引中数据,就不用再从索引映射到数据行拿数据了。

使用索引的代价:对于写操作多的表,索引更新方面开销会更大,而且索引会占用空间。

挑选索引:①为用户搜索,排序,分组为条件的列创建索引。

        ②考虑数据列的基数,基数越大,索引建立效果越好。

     ③索引短小值,索引列数据类型尽可能小。从而加快查询速度,减小io,InnoDB引擎使用的聚簇索引,它的主键和数据行存储在一起,二主键与二级索引存储在一起,如果主键索引够小,会减小空间而且查询速度也会加快。

     ④索引字符串值的前缀,即在创建索引的列是字符串类型的时候要标明列的长度。

     ⑤利用最左前缀,即当有组合索引的时候,最左边的索引是必不可少的。

     ⑥不要建立过多的索引。

     ⑦让参与比较的索引相匹配。(在使用精确查询的时候使用散列索引,在使用范围或模糊查询的时候使用b树,在使用空间范围的时候使用r树)

     ⑧利用慢查询找出那些慢查询低劣的sql。

5.2mysql查询优化程序

  使用方法:在insert,update,select,delete语句前面使用一个关键字explain后,会有显示相关使用索引和其他信息。

  工作目标:尽可能的使用索引,并且使用最严格的索引消除对行数量随时可能快速的增加,它主要是尽力排除那些不符合条件的行。

  指导意见:①分析表:这将生成关于键值分布情况的统计数据,他们可以帮助优化程序更准确地评估索引效率。

       ②使用explain验证优化程序的操作。

       ③在有必要时给予优化程序提示或改写他。如force index,use index,ignore index,straight_join(强制要求优化程序的顺序使用各个表)

       ④比较拥有相同数据类型的列。

       ⑤让索引列在比较表达式中单独出现。

       ⑥不要在like模式开始位置使用通配符。

       ⑦利用优化程序的长处(使用链接查询替代子查询)。

          ⑧检测查询的多种形式,并多次测试。

       ⑨避免使用数据类型自动转化。

  使用explain检查优化操作sql

5.3选择利于高效查询的数据类型

  ①多用数字运算,少用字符串运算。

  ②当较小类型够用时,就不用较大类型。

  ③把数据列声明为not null。

  ④考虑使用enum列。

  ⑤使用procedure analyse()分析表。

  ⑥整理表碎片。

     % mysqldump db_name tbl_name -> dump.sql

   % mysql db_name<dump.sql

  ⑦把数据压缩到blob或text列。

  ⑧使用合成索引。

  ⑨避免索引查询blob和text.

  ⑩把blob和text单独剥离处理。

5.4选择利于高效查询的表存储格式

MyIsam:对于变长和定长的处理速度不同,定长处理速度大于边长,但承担着空间的代价。变长随着写操作的增加会产生许多碎片,为维护好性能,需要定期optimize table;

当表崩溃的时候,定长的恢复速度要大于变长的。

InnoDB:对于变长和定长的处理速度差异不大,但在io上面变长占优势,

    默认情况下InnoDB使用的是compact行格式{其设计目标是能高效存放数据,简单来说,如果一个页中存放的行数据越多,其性能就越高。}

    对于包含重复数据的表使用compressed格式{存储在其中的行数据会以zlib的算法进行压缩}

    对于带有text或blob格式的使用DYNAMIC格式{说每条记录所占用的字节是动态的,其优点节省空间,缺点增加读取的时间开销。}

5.5高效加载数据

  1.把数据从缓存刷到数据库的的次数减少,那么数据加载的速度就会越快。(因为批量加载的速度要高于单行加载的速度)

  2.表的索引越少,加载速度越快。

  3.与长sql想比,短sql执行速度更快。

load date比insert效率高,load date在不带locale的情况先比带local要快,因为不带local可以直接在服务器端进行读取操作,如果带local需要在客户端读到服务器端再进行读取解析。

  insert一组数据比insert多条数据要快。

  减少索引的刷新次数:方式一:可以启动事物 方式二:可以锁定写操作。

            对MYISAM还有种方式就是延迟索引的刷新:delay_key_write;方式二:对于大量插入数据可以先删除索引,然后在重新创建或先关闭然后再开启。

            对InnoDB删除索引(不适用于集群)或添加附件表的形式(视业务而定)。

5.6调用,锁定,并发

  mysql调度策略:①写入的优先级比读取的优先级高。

           ②表的写入操作一次只能进行一个,如果有多个需要等待执行。

           ③可以同时处理多个对同一个表读取操作。 

  InnoDB利用行级锁定,只有在必要的时候才进行行级锁定,在读取的时候根本就不会进行行级的锁定。

  ①进行写入操作的时候,需要有对表操作的互斥锁。

  ②在进行读取操作的时候需要对表进行锁定,防止对表数据的更改或插入操作。

  InnoDB:在数据更新操作上比较好。(行级锁)

  MYIsam:在检索速度快,更新数据较差。(表级锁)

  死锁:在开启事物和表锁定的情况下回出现两个锁,在一定情况下可能会出现争夺资源从而形成相互等待的情况。

  

  

       

       

        

        

        

         

猜你喜欢

转载自www.cnblogs.com/xiechenglin/p/10467391.html