我有一个表Employee
,截至目前它有21列和611,028行。
当我运行以下查询时,
select count(*) from employee where employee.joined_at > '2016-02-15';
输出:81632
当我按照explain
查询运行时,
explain select count(*) from employee where employee.joined_at > '2016-02-15';
输出如下,
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | employee | range | index_joined_at | index_joined_at | 9 | null | 158216 | Using where
你可以看到没有。与实际count
相比,行扫描非常高。这怎么可能?我可以信任explain
命令来优化我的查询吗?如果是,那么何时?
我正在使用mysql版本5.5.47-0ubuntu0.14.04.1
。我找到了类似的文章here。但它没有解释我这种行为的原因。那么,我何时可以信任explain
mysql命令?
我的表创建命令(我为安全目的重命名了列名)
CREATE TABLE `Employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column 2` date DEFAULT NULL,
`column 3` int(11) DEFAULT NULL,
`column 4` int(11) NOT NULL DEFAULT '0',
`column 5` int(11) NOT NULL DEFAULT '0',
`column 6` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 7` int(11) DEFAULT NULL,
`column 8` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 9` text COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(11) DEFAULT NULL,
`joined_at` datetime DEFAULT NULL,
`column 12` datetime DEFAULT NULL,
`column 13` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`phone_no` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 15` text COLLATE utf8_unicode_ci,
`status` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'Cold',
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`column 18` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 19` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 20` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`column 21` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
KEY `index_user_id` (`user_id`),
KEY `index_joined_at` (`joined_at`),
KEY `index_phone_no` (`phone_no`),
KEY `index_status` (`status`),
KEY `index_email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=627960 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;