zoukankan      html  css  js  c++  java
  • MySQL:索引

    索引

    一、定义

    索引是对数据库表一列或多列的值进行排序的一种结果

    二、优点

    • 保证数据的唯一性
    • 加快数据查询速度
    • 加速表与表之间的连接
    • 再使用分组和排序的子句进行数据查询时。可以减少查询中分组和排序的时间

    三、缺点

    • 创建索引和维护索引耗费时间长
    • 占用磁盘空间

    四、设计原则

    • 索引并非越多越好
    • 对数据量小的表,尽量不使用索引
    • 避免对经常更新的表进行过多的索引,并且索引中的列尽可能的少
    • 在条件表达式中经常用到的不同值较多的列上建立索引,在不同值少的列上不要建立索引

    五、索引不能使用

    • 使用like关键字查询语句的时候,如果匹配字符串的第一个字符为“%”,索引不起作用,只有“%”不在第一个位置索引才会起作用;2.6索引不起作用
    • 使用or关键字的查询语句的时候,查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询才起作用;
    • 使用多列索引的查询语句的时候,只有查询条件中使用了这些字段的第1个字段时,索引才被使用;
      • 例:CREATE INDEX index_id_price ON fruits(f_id,f_price);
        • 起作用:explain select * from fruits where f_id=’12’;
        • 不起作用:explain select * from fruits where f_price=5.2;

    六、创建索引

    1、建表时创建索引

    1.1总语法:

    create table 表名(
      字段名 字段类型
      ……
      [unique|fulltext|spatial]----唯一索引|全文索引|空间索引
      [index|key]------------------指定创建的索引
      [索引名称]
      (指定表中的字段[length]1,……,表中的字段n)
      length表示可选参数,表示索引长度,只有字符串类型的字段才能指定索引长度
      [ASC|DESC]-------------------升序,降序
    )

    1.2实例

    • 普通索引/单列索引
    create table book2(
     id int,
     name varchar(4),
     key suoyinming (id)
    );
    
    •  多列索引
    create table t3(
      id int,
      name char(30),
      age int,
      key (id,name)
    );

    注意:

    查询时遵从“最左前缀”,即利用索引最左边的列集来匹配行。如:由id,name,age,这3个字段构成的索引,索引行中按id/name/age的顺序存放,索引可以搜索下面的字段组合(id,name,age)、(id,name)或者id。不能搜索age或者(name,age),因为他们不构成索引最左面的前缀

    • 唯一索引----索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
    create table book3(
       id int,
       name varchar(5),
       unique key (id)
     );
    
    • 全文索引
    create table book4(
    id int,
    name varchar(5),
    fulltext key (name)
    )
    engine=myisam         将搜索引擎改为MySIAM
    ;

    注意:
    (1)引擎必须改为MyISAM,且字段类型只能是char、varchar和text列。
    (2)索引总是对整个列进行,不支持局部(前缀)索引

    • 空间索引-------引擎必须改为MyISAM,且空间类型的字段必须为空
    create table book6(
     id int,
     name varchar(5),
     g geometry not null,
     spatial index (g)
    )
    engine=myisam
    ;

    2、在以创建的表上添加索引

    • alter table 表名 add 索引基本语句
    • create 索引限制index 索引名 on 表名(指定表中的字段);

    六、查询索引

    1、索引是否成功建立

    show create table book2G;
    *************************** 1. row ***************************
           Table: book2
    Create Table: CREATE TABLE `book2` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(4) DEFAULT NULL,
      KEY `suoyinming` (`id`)----------------成功建立
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    2、索引是否正在执行

    • 语法:explain select 字段 from 表名 where 索引字段名=符合索引类型的索引值G;
    • 实例
    mysql> explain select * from book2 where id=1990G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE                       select_type:指定所使用select查询的类型,SIMPLE表示简单查询
      table: book2                          table:指定数据库读取的数据表的名字,按被读取的先后顺序排列
       partitions: NULL
             type: ref                           type:指定本数据表与其他数据表的联系
    possible_keys: suoyinming                     possible_keys:给出MySQL在搜素数据记录时可选用的各个记录
            key: suoyinming                     key:是MySQL实际选用的索引 
          key_len: 5                            key_len:给出索引按字节计算的长度,key_len数值越小,表示越快
              ref: const                         ref:给出关联关系中另一个数据表的数据列的名字
             rows: 1                           rows:表示MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数
         filtered: 100.00
            Extra: NULL                        Extra:提供关联操作的相关信息

    3、查看指定表中的索引

    • 语法:show index from 表名G
    • 实例:
    *************************** 1. row ***************************
            Table: book                      Table: 表示创建的表
       Non_unique: 1                        Non_unique:表示索引是否唯一,1表示非唯一索引,0表示唯一索引
         Key_name: id                       Key_name: 索引名
     Seq_in_index: 1                         Seq_in_index:表示该字段在索引的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序
      Column_name: id                       Column_name:表示定义索引的列字段
        Collation: A
      Cardinality: 0
         Sub_part: NULL                     Sub_part:表示索引的长度
           Packed: NULL
             Null: YES                     Null: 表示该字段是否能为空值
       Index_type: BTREE                   Index_type:表示索引类型
          Comment:
    Index_comment:

    七、删除索引

    • alter table 表名 drop index 索引名   注意:auto_increment约束字段的唯一索引不能被删除
    • drop index 索引名 on 表名
  • 相关阅读:
    CSS中z-index的层级树概念
    随记
    PHP 随笔
    linux 相关
    Nginx 虚拟主机 VirtualHost 配置
    PHP 杂记
    Composer 资料
    PHP Yii架构学习
    java 日志技术汇总(log4j , Commons-logging,.....)
    Java 随笔
  • 原文地址:https://www.cnblogs.com/hahayixiao/p/10251720.html
Copyright © 2011-2022 走看看