我正在对20万行表中的索引列运行一个非常简单的查询。
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"
答案 0 :(得分:2)
是的,绝对应该跑得更快。
您可能犯过以下常见错误之一:
date
列。date
列不是索引中的第一列,因此无法用于此查询。要找出它是什么,请运行SHOW CREATE TABLE prvol
并发布输出。
您可以采取的另一件措施是避免使用SELECT *
。始终只选择您需要的列。即使您认为您需要所有列,您仍应明确列出它们以确保安全性,以防架构在未来发生变化。
答案 1 :(得分:2)
我最终弄清楚为什么我的查询很慢。请参阅here以获取答案。它最终与网络时间无关。这是一个缓存大小问题。
答案 2 :(得分:1)
我实际上认为查询运行得很好。
在0.828秒内返回6,882行N列(选择*)是合理硬件上合理的时间。
网络时间21.438秒是通过网络传输x MB所需的时间,其中x = bytes per row * 7k
可能是几十MB。但网络上的21s有点慢 - 但这不是查询问题。
答案 3 :(得分:0)
我正在使用此库。它比Google的要快。
<script src="https://api.mqcdn.com/sdk/place-search-js/v1.0.0/place-search.js"></script>
<link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/place-search-js/v1.0.0/place-search.css"/>
<script type="text/javascript">
var ps;
window.onload = function () {
ps = placeSearch({
key: 'lYrP4vF3Uk5zgTiGGuEzQGwGIVDGuy24',
container: document.querySelector('#place-search-input'),
useDeviceLocation: false,
collection: [
'poi',
'airport',
'address',
'adminArea',
]
});
}