在某平台拿到了获取了所有股票的日K数据(出于学习目的),共1200w 多条。随手一个 select count(*) 想查下总数发现都需要跑好几分钟才能响应。
于是网上搜了几种统计总数的方式,分别试下,对比下查询效率。
表结构如下
CREATE TABLE `east_dc_dkline` (
`S_CODE` varchar(10) NOT NULL COMMENT '股票代码',
`S_NAME` varchar(20) DEFAULT NULL COMMENT '股票名称',
`DK_DATE` date NOT NULL COMMENT '数据日期',
`OPENING_PRICE` varchar(20) DEFAULT NULL COMMENT '开盘价',
`LATSET_PRICE` varchar(20) DEFAULT NULL COMMENT '最新价',
`TOP_PRICE` varchar(20) DEFAULT NULL COMMENT '最高价',
`LOWEST_PRICE` varchar(20) DEFAULT NULL COMMENT '最低价',
`VOLUME` varchar(30) DEFAULT NULL COMMENT '成交额(手)',
`AMOUNT` varchar(30) DEFAULT NULL COMMENT '成交量',
`AMPLITUDE` varchar(50) DEFAULT NULL COMMENT '振幅',
`GAINS` varchar(20) DEFAULT NULL COMMENT '涨幅(百分比)',
`RISING_PRICE` varchar(10) DEFAULT NULL COMMENT '上涨价格',
`TURNOVER_RATE` varchar(10) DEFAULT NULL COMMENT '换手率(百分比)',
PRIMARY KEY (`S_CODE`,`DK_DATE`),
KEY `idx_date` (`DK_DATE`),
KEY `idx_name_date` (`S_NAME`,`DK_DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
以下每种方法各执行3次,比较平均时间;【总数据条数为 12300489 】
1,SELECT COUNT(*) FROM east_dc_dkline
执行 3 min 9 sec
执行 3 min 44 sec
执行 2 min 56 sec
2,SELECT COUNT(1) FROM east_dc_dkline
执行 2 min 30 sec
执行 2 min 31 sec
执行 2 min 29 sec
3,SELECT COUNT(S_CODE) FROM east_dc_dkline – 统计字段 (非主键,ps:由于是组合主键,我count 了其中的一个字段,EXPLAIN 查看执行计划,发现走的还是 默认的索引(非主键索引))
执行 2 min 31 sec
执行 2 min 31 sec
执行 2 min 32 sec
4,SELECT COUNT(S_CODE) FROM east_dc_dkline FORCE INDEX(PRI) – 统计字段 强制使用主键索引
执行 1 min 49 sec
执行 1 min 52 sec
执行 1 min 21 sec
以上为本地windows 系统内安装的mysql数据库 对几种查询方式的执行时间比较,供参考。
补充:sql 执行前可通过 EXPLAIN 先看下执行计划内的索引使用情况。以及可以直接根据 执行计划内 的 rows 得到大致的表内数据量。
over…