本地主机上的 MySQL 查询速度很慢 - moSTLy 网络持续时间

标签 mysql sql

我正在对 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/

相关文章:

mysql - mysqli 中查询结果错误

mysql - 删除 MySQL 中字段具有重复数字的行

PHP 在从数据库检索时截断散列密码

php - 如何改进以下 mysql 选择?

mysql - 为什么此查询对一个表有效但对另一个表超时

mysql - 先按姓氏排序列表

mysql - 联合两个表并重命名表特定列

c# - 如何在 LINQ to SQL 中查看导致 SubmitChanges 出错的 sql?

php - utf8mb4_unicode_ci 在 PhpMyAdmin 中选择,但 WordPress 表使用 utf8mb4_unicode_520_ci 排序规则

sql - Postgresql 在使用空值优先/限制对空列进行排序时出现奇怪的行为