MySQL 的索引

第一个索引结构

有如下表结构

CREATE TABLE `tb` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  KEY `abc` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
具体查看是否使用到索引用
mysql> explain select * from tb where a = 'xx' and c = 'xx'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb
         type: ref
possible_keys: abc
          key: abc
      key_len: 5
          ref: const
         rows: 1
        Extra: Using where; Using index
1 row in set (0.00 sec)
where a=xx and b=xx and c=xxx 此语句可以用到索引 
where b=xx and a=xx and c=xxx 同上,顺序没有关系,同样能用到索引,mysql内部会做优化
where a=xx and b=xx 可以用到索引
where a=xx and c=xx 可以用到索引
where b=xx and c=xx 用不到索引 
where b=xx 用不到索引 
where c=xx 用不到索引
Where a=xx order by b 可以用到索引
Where a>xx order by c 可以用到索引

联合索引中有一个规则:左前缀匹配规则
a b c 之间的联系断了,就会影响索引的效率
where a=xx and c=xx 这个例子中索引的层面只是到了a层面上
where b=xx and c=xx 这个例子中索引不是从a开始,所以用不到索引
第二个索引结构
CREATE TABLE `tb` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  KEY `a` (`a`),
  KEY `b` (`b`),
  KEY `c` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Where a=1 order by c 用到了索引a
第三个索引结构
CREATE TABLE `tb` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  KEY `ab` (`a`,`b`),
  KEY `acd` (`a`,`c`,`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Where a=xx and c!=xx and d=xx order by b  用到索引ab
Where a=xx and c=xx and d!=xx order by b  用到索引ab

Explain 参数详解

Type: 类型,是否使用了索引还是全表扫描
Possible_key: 可能选择的索引
Key: 实际使用上的索引是哪个字段
Ken_len: 真正使用了哪些索引,不为 NULL 的就是真实使用的索引
Ref: 显示了哪些字段或者常量被用来和 key 配合从表中查询记录出来
Rows: 显示了MySQL认为在查询中应该检索的记录数
Extra: 显示了查询中MySQL的附加信息,关心Using filesort 和 Using temporary,性能杀手

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值