在某平台拿到了获取了所有股票的日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…

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐