zoukankan      html  css  js  c++  java
  • MySql 索引

    所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径。根据存储引擎可以定义

    每个表的最大索引数和最大索引长度,每种存储引擎(如MyISAM、InnoDB、BDB、MEMORY 等)对每个表至少支持16

    个索引,总索引长度至少为256 字节。

    一、索引创建、查询与删除

    1. 索引创建
    
          索引可以在创建表的时候同时创建,也可以使用alter table命令或create index命令随时增加新的索引。
    
    create index命令语法:
    
    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    
    [USING index_type]
    
    ON tbl_name (index_col_name,...)
    
    参数解析:
    
    index_type:
    
    btree、hash...
    
    index_col_name:
    
    col_name [(length)] [ASC | DESC]
    
    前缀索引创建实例:
    
    create index ind_company2_name on company2(name(4));
    
    复合索引创建实例:
    
    create index ind_sales2_companyid_moneys on sales2(company_id,moneys);
    
    2. 索引查询:
    
    show index from tbl_name;
    
    show keys from tbl_name;
    
    3. 索引删除:
    
    drop index index_name on tbl_name;

    二、索引存储分类

     MySQL 中索引的存储类型目前只有两种(BTREE 和HASH),具体和表的存储引擎相关:MyISAM 和InnoDB 存储引
    
    擎都只支持BTREE 索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE 索引(Memory存储引擎默认使用HASH索引)。
    
    Mysql目前还不支持函数索引,但是支持前缀索引,即对索引字段的前N个字符创建索引。
    
          MyISAM 存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和
    
    索引是存储在同一个表空间里面,但可以有多个文件组成。
    
    BTREE索引和HASH索引的差异:
    
    (1)HASH索引只用于使用=<=>操作符的等式比较。如果一定要使用范围查询的话,只能使用BTREE索引。
    
    (2)优化器不能使用Hash索引来加速order by操作。
    
    (3)使用Hash索引时MySQL不能确定在两个值之间大约有多少行。如果将一个MyISAM表改为的Hash索引memory表,
    
    会影响一些查询的执行效率。
    
    (4)Hash索引只能使用整个关键字来搜索一行。

     三、索引设计的原则

    1. 最适合索引的列是出现在where子句中的列,或连接子句中指定的列。

    2. 使用唯一索引。索引的列的基数越大,索引的效果越好。

    3. 使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,这样可以节省大量索引空间,也可能会使查询更快。

    4. 利用最左前缀。在创建一个n列的索引时,实际上是创建了MySQL可利用的n个索引。多列索引可起几个索引的作用,

    因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。

    5. 不要过度索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。

    6. 对于InnoDB存储引擎的表,记录默认会按照主键或唯一索引或内部列的顺序保存。按照主键或者内部列进行的访问是

    最快的,所以要选择最常作为访问条件的列作为主键,提高查询的效率。InnoDB表的普通索引都会保存主键的键值,所

    以主键要尽可能选择短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果。

    四、索引使用

    1. 使用索引
    
    (1)对于多列索引,只要查询的条件中用到了最左边的前缀,索引一般就会被使用。
    
    (2)对于使用like 的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如果如果like 后面跟
    
    的是一个列的名字,那么索引也不会被使用。
    
    (3)如果对大的文本进行搜索,使用全文索引而不用使用like ‘%%’。
    
    (4)如果列名是索引,使用column_name is null 将使用索引。
    
    2. 存在索引但不使用索引
    
    (1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。
    
    (2)如果使用MEMORY/HEAP 表并且where 条件中不使用“=”进行索引列,那么不会用到索引。heap 表只有在“=”的
    
    条件下才会使用索引。
    
    (3)用or分割开的条件,如果出现一个条件的列没有索引的话,那么涉及到的索引都不会被用到。
    
    (4)对于复合索引,如果条件中不是索引列的前缀,索引也不会被用到。
    
    (5)使用like的查询如果后面的常量是以%开头,不会使用索引。
    
    (6)如果列类型是字符串,那么一定记得在where 条件中把字符常量值用引号引起来,否则的话即便这个列上有索引,
    
    MySQL 也不会用到的,因为,MySQL默认把输入的常量值进行转换以后才进行检索。
    
    3. 查看索引的使用个情况
    
    show status like 'Handler_read%';
    
        如果索引正在工作,Handler_read_key 的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加
    
    索引得到的性能改善不高,因为索引并不经常使用。Handler_read_rnd_next 的值高则意味着查询运行低效,并且应
    
    该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next
    
    的值较高,则通常说明表索引不正确或写入的查询没有利用索引。
    
    4. 使用SQL提示
    
    (1use index
    
       在查询语句中表名的后面,添加use index来可以提供希望MySQL 去参考的索引列表,就可以让MySQL不再考虑其
    
    他可用的索引。
    
    使用示例:
    
    select * from sales2 use index (ind_sales2_id) where id = 3;
    
    (2)ignore index
    
      让MySQL忽略一个或多个索引。
    
    (3)force index
    
        强制Mysql使用一个特定的索引。
  • 相关阅读:
    Redis学习笔记
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    RedisTemplate操作命令
    将chrome储存的密码转为MarkDown表格
    使用redisson做redis分布式锁
    RocketMQ 整合SpringBoot发送事务消息
    关于java读写锁的测试
    java8 stream记录
  • 原文地址:https://www.cnblogs.com/lucky-man/p/6207811.html
Copyright © 2011-2022 走看看