MySQL-mysql利用索引的问题

MySQL-mysql利用索引的问题

归属感 发布于 2017-07-20 字数 680 浏览 1207 回复 3
CREATE TABLE `goodslog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` varchar(100) NOT NULL,
`goodsld` int(11) NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_userid_date` (`userid`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

explain select count(1) from goodslog where date>='2012-04-01' and date<'
012-05-01'G

id: 1
select_type: SIMPLE
table: goodslog
type: index
possible_keys: NULL
key: idx_userid_date
key_len: 310
ref: NULL
rows: 1
Extra: Using where; Using index

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-10-11 3 楼

Use Index 的概念要明确,只是说明进行SQL执行的时候没有读取原数据,而是直接使用了index中的数据。explain 结果集中的ref: NULL 而不是 ref: RANGE 表示了date的between 并没有走索引。整个执行过程如下,取出 idx_userid_date 中的所有数据进行遍历,遍历索引判断 date是否符合条件,计算所有符合条件的行数总和。

夜无邪 2017-07-27 2 楼

innodb的主键索引都是聚簇索引,它的辅助索引里面都包含有表的主键,而且主键都在辅助索引的最后一列.
Extra中有using index,说明数据只要从索引中就可以获取
而myisam的索引,都是普通索引,存储的是列的值,还有列在原表中的地址值---不存储主键值.
索引结构如图:

灵芸 2017-07-24 1 楼

type: index表示扫描idx_userid_date,这里根据索引最左原则可以看到不会走索引,这里的是全索引扫描。对于Using index, 覆盖索引的理解, 不是一定是使用索引,也只是对整个idx_userid_date的全扫描。