美文网首页
mysql 索引笔记!

mysql 索引笔记!

作者: DragonersLi | 来源:发表于2017-06-30 18:26 被阅读42次

    mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引.

    单列索引:一个索引只包含一个列,一个表可以有多个单列索引.
    组合索引:一个组合索引包含两个或两个以上的列,

    表结构如下:

    user    CREATE TABLE `user` (                                                          
              `id` int(11) unsigned NOT NULL AUTO_INCREMENT,                               
              `username` varchar(25) COLLATE utf8_unicode_ci NOT NULL,                     
              `password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,                     
              `email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,                    
              PRIMARY KEY (`id`)                                                           
            ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='测试用户信息表';
    

    一、单列索引(只有一个字段)

    增加索引:
    1. 主键索引 :(建立的规则是 int优于varchar,一般在建表的时候创建,一个表只能有一个主键)
    //语法如下:
    alter table 表名 add primary key 索引名(字段名);  
    //demo如下:
    alter table user add primary key id(id);  
    primary主键,如果插入值有重复会报类似错误:Duplicate entry '4' for key 'PRIMARY'
    
    
    2. 唯一索引 :(字段值可以为NULL,但必须唯一)
    //语法如下:
    create unique  index  索引名  on 表名(字段名);//第一种写法
    alter table 表名 add unique  index 索引名(字段名); //第二种写法
    //demo如下:
    create unique index index_username on user(username);
    alter table user add unique index index_username(username); 
    
    unique唯一,如果插入值有重复会报类似错误:Duplicate entry 'username' for key 'index_username'
    
    
    
    3. 普通索引 :
    //语法如下:
    create index  索引名  on 表名(字段名);//第一种写法
    alter table 表名 add index 索引名(字段名); //第二种写法
    //demo如下:
    create index  index_username on user(username);
    alter table user add index index_username(username); 
    
    
    
    
    4. 全文索引:(InnoDB不支持,MyISAM支持性能比较好,一般在 CHAR、VARCHAR 或 TEXT 列上创建。)
    //语法如下:
    alter table 表名 add fulltext (索引名:不填默认字段名)(字段名);  
    //demo如下: 
    alter table user add fulltext (test)(`desc`);
    
    
    
    
    二、组合索引:(多个字段)
    //语法如下:
    create index  索引名  on 表名(字段名,字段名,... ); 
    
    //demo如下:
    create index index_u_e_m on user(username,email,token);
    
    
    查看索引:
    //语法如下:
    show index from 表名;
    //demo如下:
    show index from user;
    
    Paste_Image.png
    删除索引:
    //语法如下:
    alter table `库名`.`表名` drop index `索引名`;
    //demo如下:
    alter table `1234567890`.`user` drop index `index_email`; //第一种写法
    drop index index_email ON `user` ; //第二种写法
    
    like 模糊查询使用索引 demo:
    explain select * from user where username like 'a%';
    explain select * from user where username like '%a';
    

    like ‘a%’ 会用到 索引:

    Paste_Image.png Paste_Image.png
    1. like语句的 如果你对字段建立了一个索引.当查询的时候的语句是 lick '%ABC%' 那么这个索引讲不会起到作用.而lick 'ABC%' 那么将可以用到索引!
    2. 索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串!
    3. 不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描!
    4. 当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系!

    相关文章

      网友评论

          本文标题:mysql 索引笔记!

          本文链接:https://www.haomeiwen.com/subject/unsicxtx.html