你能帮我索引我的桌子吗?
问题是我索引了我的表格,但我仍然有"全表扫描"在我的解释中
这是我的(工作)查询,但在大表上它可能很慢,我不知道如何更改
EXPLAIN select * from stats_clicked s
join visitor v on s.visitor_id=v.id
PS。 index3 - 当访问者= 1刷新页面id = 5时,我不会多次看到值(1,5)
CREATE TABLE `visitor` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`visited_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `stats_clicked` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`visitor_id` int(11) NOT NULL,
`page_clicked_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index3` (`visitor_id`,`page_clicked_id`),
KEY `index1` (`visitor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into visitor (`visited_time`) values
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944);
insert into `stats_clicked` ( `visitor_id`,`page_clicked_id`) values
(1,47),(2,24),(3,83),(3,8),(3,85),(3,88),(4,57),
(5,2),(6,1),(7,28),(8,83),(9,11),(9,16),(9,1),(10,17),
(11,70),(12,73),(13,97),(14,57),(15,30),(15,2),(15,22);
答案 0 :(得分:0)
如果我执行你上面所做的事情,我会
EXPLAIN select * from stats_clicked s
join visitor v on s.visitor_id=v.id
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
| 1 | SIMPLE | v | ALL | PRIMARY | NULL | NULL | NULL | 15 | NULL |
| 1 | SIMPLE | s | ref | index3,index1 | index3 | 4 | so_gibberish2.v.id | 1 | Using index |
+----+-------------+-------+------+---------------+--------+---------+--------------------+------+-------------+
但是,如果我截断然后执行以下大量数据的加载(最终超过100K行):
truncate table visitor;
insert into visitor (`visited_time`) values
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944),
(1467122944),(1467122944),(1467122944);
insert into visitor (`visited_time`) values
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
(1467122945),(1467122945),(1467122945),
insert into visitor (`visited_time`) values
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946),
(1467122946),(1467122946),(1467122946);
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
insert visitor(`visited_time`) select `visited_time` from visitor;
select count(*) from visitor;
-- 104448 rows
这导致 NOT 表扫描:
EXPLAIN select * from stats_clicked s
join visitor v on s.visitor_id=v.id;
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
| 1 | SIMPLE | s | index | index3,index1 | index3 | 9 | NULL | 22 | Using index |
| 1 | SIMPLE | v | eq_ref | PRIMARY | PRIMARY | 4 | so_gibberish2.s.visitor_id | 1 | NULL |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+
原因列于手册页How MySQL Uses Indexes:
索引较少 对于小型表或报表的大表的查询很重要 查询处理大部分或全部行。当查询需要访问时 大多数行,按顺序读取比通过更快 一个索引。顺序读取可以最大限度地减少磁盘搜索,即使不是全部 查询需要行。
上面列出的原因。在您的问题的示例中,您使用的行数太少,无法使索引值得使用。所以db引擎选择了它所谓的(可能)更快的方法,就是不在你的小桌子上使用索引。
答案 1 :(得分:0)
stats_clicked
不需要id
。实际上,它的存在会减慢使用该表的所有可能的查询。 More details