zoukankan      html  css  js  c++  java
  • MySQL中索引不会被用到的情况

    MySQL中索引的类型

    一般可分为四类:

    1. 普通索引:最普通的索引
    2. 唯一索引:索引列的值必须唯一,但允许有空值
    3. 主键索引:一种特殊的唯一索引,不允许有空值
    4. 联合索引:索引列有多个字段,使用时需要满足最左前缀原则

    普通索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    • 创建索引
      CREATE INDEX indexName ON mytable(username(length));

      如果是 CHAR,VARCHAR 类型,length 可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length,下同。

    • 修改表结构

        代码如下:

    ALTER mytable ADD INDEX [indexName] ON (username(length))
    • 创建表的时候直接指定
    CREATE TABLE mytable(
        ID INT NOT NULL,
        username VARCHAR(16) NOT NULL,
        INDEX [indexName] (username(length))
    );
    • 删除索引的语法
    DROP INDEX [indexName] ON mytable;

    唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    • 直接创建
    CREATE UNIQUE INDEX indexName ON mytable(username(length))
    • 修改表结构
    ALTER mytable ADD UNIQUE [indexName] ON (username(length))
    • 创建表的时候直接指定
    CREATE TABLE mytable(   
        ID INT NOT NULL,    
        username VARCHAR(16) NOT NULL,   
        UNIQUE [indexName] (username(length))   
    );

    主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

    • 直接创建
    CREATE TABLE mytable(   
        ID INT NOT NULL,    
        username VARCHAR(16) NOT NULL,   
        PRIMARY KEY(ID)  
    );

    当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    联合索引

    为了形象地对比单列索引和组合索引,为表添加多个字段:

    CREATE TABLE mytable(   
        ID INT NOT NULL,    
        username VARCHAR(16) NOT NULL,   
        city VARCHAR(50) NOT NULL,   
        age INT NOT NULL  
    );

    为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。就是将 name, city, age 建到一个索引里:

    ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

    索引用不上的情况

    索引不是每次都可以生效的,如果我们操作不对,那么很有可能是走全表扫描而不是走的索引,Explain 中的 possible_key、key_len 以及 key 参数都可以分析我们的 SQL 语句是否用到了索引。

    以下情况将会导致索引失效

    1. 查询的列中使用了 != 比如 select id,name,age from student where id != 2;

    2. 查询的列中使用了函数操作,比如 pow(id,2) 对 id 做平方这种函数表达式,也不会用到索引

    3. 如果条件中有 or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)

    4. 联合索引中即使满足最左前缀原则,但是第一个条件带了范围查询,那么也不会用到索引

    5. 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

    6. 如果 MySQL 估计使用全表扫描要比使用索引快,则不使用索引

    以上都可以使用 Explain 语句进行测试是否用到了索引。

  • 相关阅读:
    三大流程控制:1、if判断语句 2、while循环语句 3、for循环语句
    变量剩余的部分,然后是基本数据类型、输入输出和基本运算符
    1.操作系统、2.编程语言分类、3.变量、4.运行python文件的三个阶段
    数据库4 待修
    电脑组合键
    redis 基础应用
    数据库3 待改
    数据库2 待修
    mysql 数据库基础篇
    socketserver 和 事件Event
  • 原文地址:https://www.cnblogs.com/lyh233/p/14690870.html
Copyright © 2011-2022 走看看