我正在对 2000 万行表中的索引列运行一个非常简单的查询。
select * from prvol where date = '20100203';
大约需要 22 秒。我是 sql 新手,但认为索引列应该比这更快。没有内存问题。此外,输出显示时间主要在网络中。我在服务器所在的同一台机器上运行查询。
/* 0 rows affected, 6,882 rows found. Duration for 1 query: 0.828 sec. (+ 21.438 sec. network) */
那个网络时间是什么意思?您希望此查询运行得更快吗?
编辑:根据要求,这里是一些输出。
EXPLAIN SELECT * FROM prvol WHERE date = '20100203';
"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
"1","SIMPLE","prvol","ref","Index 1","Index 1","4","const","6881","Using where"
SHOW CREATE TABLE prvol;
"Table","Create Table"
"prvol","CREATE TABLE `prvol` (
`exch` varchar(10) DEFAULT NULL,
`ticker` varchar(10) DEFAULT NULL,
`date` date DEFAULT NULL,
`open` float unsigned DEFAULT NULL,
`high` float unsigned DEFAULT NULL,
`low` float unsigned DEFAULT NULL,
`close` float unsigned DEFAULT NULL,
`vs` float unsigned DEFAULT NULL,
`aclose` float DEFAULT NULL,
KEY `Index 1` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1"
最佳答案
是的,绝对应该运行得更快。
您可能犯了以下常见错误之一:
- 您索引了一个列,但它不是
date
列。 - 您创建了一个多列索引,但
date
列不是索引中的第一列,因此不能用于此查询。 - 您清楚地记得添加了一个索引,但不知何故索引似乎“消失了”(可能是因为您运行了查询并给出了错误,但您没有注意到错误消息)。
要找出它是哪个,请运行 SHOW CREATE TABLE prvol
并发布输出。
要改善这种情况,您可以做的另一件事是避免使用 SELECT *
。始终只选择您需要的列。即使您认为您需要所有列,为了安全起见,您可能仍应明确列出它们,以防将来架构发生变化。
关于本地主机上的 MySQL 查询速度很慢 - moSTLy 网络持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332225/