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 book2\G;
*************************** 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=1990\G;
*************************** 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 表名

posted on 2019-01-10 18:39  迷途行者  阅读(140)  评论(0编辑  收藏  举报

导航