SELECT count(*) FROM table1 WHERE cond1=exp1 AND cond2=exp2
返回行数。例如,47。
SELECT count(*),some_column FROM table1 WHERE cond1=exp1 AND cond2=exp2
返回行数(例如,47),和一个来自
some_column
的任意值,而且它比第一个查询快两倍!我在服务器上直接测试了它,当然是通过 GUI(HeidiSQL),结果相同,查询2快两倍!
为什么会这样呢?有任何想法吗?
我使用的是 MySQL 5.6.21 和 Win Server 2012 上的 Apache/PHP 5.3。
更新1:
CREATE TABLE `programs` (
`tvp_id` INT(11) NOT NULL AUTO_INCREMENT,
`tvp_time` TIME NOT NULL DEFAULT '00:00:00',
`tvp_time_end` TIME NOT NULL DEFAULT '00:00:00',
`tvp_date` DATE NOT NULL DEFAULT '0000-00-00',
`tvp_title` VARCHAR(200) NOT NULL,
`tvp_channel` INT(11) NOT NULL DEFAULT '0',
`tvp_type` VARCHAR(20) NOT NULL,
`tvp_description` TEXT NOT NULL',
... more and more columns ...
PRIMARY KEY (`tvp_id`),
INDEX `tvp_date` (`tvp_date`),
INDEX `tvp_channel` (`tvp_channel`),
INDEX `tvp_time` (`tvp_time`),
)
ENGINE=MyISAM
我清除了缓存并多次运行查询 - 结果是相同的 - 2) 查询速度提升了2倍。
我的表格的具体查询如下:
1. SELECT COUNT(*) FROM programs WHERE (tvp_chanel = value_channel) AND (tvp_date = value_date)
或者
2. SELECT COUNT(*), tvp_type FROM programs WHERE (tvp_channel = value_channel) AND (tvp_date = value_date)
所以WHERE子句中的两个列都是带有索引的列。
我尝试对此查询进行EXPLAIN:
1. "id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra"
"1" "SIMPLE" "programs" "index_merge" "tvp_date,tvp_channel" "tvp_channel,tvp_date" "4,3" \N "15" "Using intersect(tvp_channel,tvp_date); Using where; Using index"
2. "id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra"
"1" "SIMPLE" "programms" "index_merge" "tvp_date,tvp_channel" "tvp_channel,tvp_date" "4,3" \N "15" "Using intersect(tvp_channel,tvp_date); Using where"
不同之处在于“使用索引”在1)查询中。那么为什么1)查询会更慢呢?
GROUP BY some_column
,第二个查询可能没有用。 - Michael BerkowskiEXPLAIN
输出)添加到您的问题中可能是一个好主意。 - Andriy M