目录
索引概述
介绍
索引(index)是帮助MYSQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引优缺点
索引结构
MYSQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:
注意:我们平常所说的索引,如果没有特别指明,都是指b+树结构组织的索引。
相对于B-Tree区别:
1. 所有的数据都会出现在叶子节点 2. 叶子节点形成一个单向链表
hash索引特点
1. hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,....) 2. 无法利用索引完成排序操作 3. 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引
存储引擎支持
在mysql中,支持hash索引的是Memory引擎,而innoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的
索引分类
索引语法
创建索引 create [unique|FUlltext] Index index_name on table_name (index_col_name...); 查看索引 show index from table_name; 删除索引 drop index index_name on table_name;
sql性能分析
sql 执行频率 mysql 客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 insert 、update、delete、select的访问频次。 show global status like 'Com______';
慢查询日志
慢查询日志记录了所有超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句的日志。mysql的查询日志默认没有开启,需要在mysql的配置文件(/etc/my.cnf)中配置如下信息: show variables like 'slow_query_log';
profile详情
explain执行计划
explan 或者 desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。 语法: #直接在select语句之前加上关键字explain/desc explan select * from table_name desc select * from table_name
索引使用
验证索引效率
在未建立索引之前,执行如下sql语句,查看sql的消时。 select * from tb_sku where sn = '100000000';
最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。 如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
范围查询
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效
索引列运算
不要在索引列上进行运算操作,索引将失效。
字符串不加引号
字符串类型字段使用时,不加引号,索引将失效。
模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
or连接的条件
用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
数据分布影响
如果MYSQL评估使用索引比全表更慢,则不使用索引。
sql提示
sql提示,是优化数据库的一个重要手段,简单来说,就是在sql语句中加入一些人为的提示来达到优化操作的目的 use index; // 建议使用 explain selcet * from tb_user_ use index(idx_user_pro) where profession = '软件工程'; ignore index; // 忽略使用 force index; // 强制使用
覆盖索引
尽量使用覆盖索引 (查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select * 注意: using index condition : 查询使用了索引,但是需要回表查询数据 using where;using index : 查询使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
前缀索引
当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
单列索引与联合索引
单列索引:即一个索引只包含单个列。 联合索引:即一个索引包含了多个列。 在业务场景中,如果存咋多个查询条件,考虑针对查询字段建立索引时,建议建立联合索引,而非单列索引。
注意:多条件联合查询时,mysql优化器会评估哪个字段的索引效率更高,会选择索引完成本次查询。