• 云途科技成立于2010年 - 专注全球跨境电商服务器租赁托管!
  • 帮助中心

    您可以通过下方搜索框快速查找您想知道的问题

    mysql 多列索引 详细说明

      in  数据库      Tags: 

    mysql索引可以分为单列索引和多列索引,单列索引,请参考:添加mysql索引的3条原则

    mysql可以为多个列创建一个索引,最多可以16列,多列索引可以视为包含通过连接索引列的值而创建值的排序数组。mysql多列索引适用场合:当你在where子句中为索引的第1个列指定已知的参数时,查询很快,即使你没有指定其它列的值,这里的其他列是多列索引里面,指定的其他列。

    一,创建测试表index_test

    mysql> CREATE TABLE `index_test` (
        ->   `id` int(11) NOT NULL auto_increment,
        ->   `user_id` int(11) NOT NULL,
        ->   `username` varchar(20) NOT NULL,
        ->   PRIMARY KEY  (`id`)
        -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    Query OK, 0 rows affected (0.08 sec)

    二,创建多列索引

    1,普通多列索引

    mysql> ALTER TABLE index_test ADD index test( user_id, username );
    Query OK, 0 rows affected (0.07 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    2,多列唯一索引

    mysql> ALTER TABLE index_test ADD unique test( user_id, username );
    Query OK, 0 rows affected (0.06 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    3,多列主键索引

    mysql> ALTER TABLE index_test ADD primary key test( user_id, username );
    Query OK, 0 rows affected (0.06 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    我们主键一般都是ID,并且是自增长的,如果有,就要先删除主键后在创建多列主键索引,不然会报错的,ERROR 1068 (42000): Multiple primary key defined;

    删除索引,可以用drop index test on index_test

    三,例子

    1,使用多列索引的情况

    例1,

    mysql> explain select * from index_test where user_id=1\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: index_test
             type: ref
    possible_keys: test
              key: test      //使用了索引test
          key_len: 4
              ref: const
             rows: 1
            Extra:
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

    例2,

    mysql> explain select * from index_test where user_id=1 and username='tank'\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: index_test
             type: ref
    possible_keys: test
              key: test
          key_len: 66
              ref: const,const
             rows: 1
            Extra: Using where
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

    例3,

    mysql> explain select * from index_test where user_id=1 and (username='tank' or username='zhang')\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: index_test
             type: range
    possible_keys: test
              key: test
          key_len: 66
              ref: NULL
             rows: 2
            Extra: Using where
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

    2,不使用多列索引的情况

    例4,

    mysql> explain select * from index_test where user_id=1 or username='tank'\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: index_test
             type: ALL
    possible_keys: test       //列出了可能存在的索引
              key: NULL       //但是并没有使用这个索引
          key_len: NULL
              ref: NULL
             rows: 2
            Extra: Using where
    1 row in set (0.01 sec)
    
    ERROR:
    No query specified

    例5,

    mysql> explain select * from index_test where username='tank'\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: index_test
             type: ALL
    possible_keys: NULL     //可能存在的索引都没有列出来
              key: NULL     //也没有使用多列索引
          key_len: NULL
              ref: NULL
             rows: 2
            Extra: Using where
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

    根据上面测试,多列索引的第一列很重要,以上面例子为例,就是user_id这一列。要想多列索列起作用,第一列必须要包含在内,如果要用到or,不要与第一列并行。看例4



    • 外贸虚拟主机

      1GB硬盘

      2个独立站点

      1000M带宽

      不限制流量

      美国外贸专用虚拟主机,cPanel面板,每天远程备份.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥180/年

    • 美国/荷兰外贸VPS

      2核CPU

      1G内存

      30硬盘

      10M带宽

      美国/荷兰外贸云服务器,专注外贸服务器行业12年.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥99/月

    • 全球外贸服务器

      8核CPU

      32G内存

      1TB硬盘

      1000M带宽

      已部署数据中心:美国洛杉矶/亚特兰大、荷兰、加拿大、英国伦敦、德国、拉脱维亚、瑞典、爱沙尼亚
      自有机柜(全球九大数据中心),稳定在线率:99.9%

      ¥999/月 原价1380

    7*24小时 在线提交工单

    如果您的问题没有得到解决,推荐您在线提交工单,我们的客服人员会第一时间为您解决问题

    展开