【问题标题】:Taking too long to return results MySQL花费太长时间返回结果 MySQL
【发布时间】:2014-09-10 08:42:17
【问题描述】:

我很困惑为什么服务器在执行以下查询时花费了太多时间:

SELECT tbl1.Column1 FROM Table1 AS tbl1 
INNER JOIN Table2 AS tbl2 ON tbl2.Column4 = tbl1.Column1

返回结果大约需要 20 分钟。 MySQL 配置 (my.ini) 文件如下所示:

[mysql]

# CLIENT #
port                           = 3306
socket                         = X:\wamp\bin\mysql\mysql5.5.8\data\mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default-storage-engine         = InnoDB
socket                         = X:\wamp\bin\mysql\mysql5.5.8\data\mysql.sock
pid-file                       = X:\wamp\bin\mysql\mysql5.5.8\data\mysql.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

# SAFETY #
max-allowed-packet             = 16M
max-connect-errors             = 1000000

# DATA STORAGE #
datadir                        = X:\wamp\bin\mysql\mysql5.5.8\data\

# BINARY LOGGING #
log-bin                        = X:\wamp\bin\mysql\mysql5.5.8\data\mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 4096
table-open-cache               = 4096

# INNODB #
innodb-log-files-in-group      = 2
innodb-log-file-size           = 128M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 2G

# LOGGING #
log-error                      = X:\wamp\bin\mysql\mysql5.5.8\data\mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = X:\wamp\bin\mysql\mysql5.5.8\data\mysql-slow.log

两个表都有主键。

问候,

F。艾哈迈德

=============== 更新:

使用上述查询运行解释后,我得到以下结果。

ID  SelectType  Table   Type        Key key_len     rows    extra
1   SIMPLE      tbl2    index       item_record_id  261     95361   Using index
1   SIMPLE      tbl1    index       record_id       261     88474   Using where;        Using    index; Using join buffer

【问题讨论】:

  • 请提供有关您的查询的解释信息。
  • 最重要的是告诉我们有关表、连接中使用的字段以及这些表上的索引。该 .ini 文件的内容没有帮助。这些被索引了吗? tbl2.Column4 和 tbl1.Column1
  • @sectus,已添加说明信息

标签: php mysql sql wamp wampserver


【解决方案1】:

试试这两个进行简单检查。

  1. 请检查 Column4 字段类型和 Column1 字段类型。如果您加入 varcharINT 将花费太多时间返回结果。
  2. 使用适当的索引来加快查询速度

【讨论】:

  • 1 - 两列都是 varchar(255) 2 - 两列都有索引
  • 用 varchar(255) 字段连接表不是一个好主意,如果任何一个表的记录超过 100 条,将花费太多时间。通过添加 id 或其他具有 INT 类型的字段来规范化您的表或找到另一种加入方式
【解决方案2】:

EXPLAIN SELECT tbl1.Column1 FROM Table1 AS tbl1 INNER JOIN Table2 AS tbl2 ON tbl2.Column4 = tbl1.Column1;

这将有助于查看读取的行数和索引以及更多查看结果。

【讨论】:

  • 1 SIMPLE tbl2 索引 item_record_id 261 95361 使用索引 1 SIMPLE tbl1 索引 record_id 261 88474 使用 where;使用索引;使用连接缓冲区
  • 我在我的问题中添加了格式正确的结果。请在上面查看。
【解决方案3】:

如果您检查的 2 列的类型不同,则可能是一个问题。另一个问题是服务器......如果你有数百万行,它的处理就不是很好。

【讨论】:

  • Table1 有大约 93K 行,Table2 有大约 90K 行。 MySQL配置已经发布在问题中。在这方面的任何建议。
  • 尝试本地查询..如果它也需要这么长的时间,我不能说它出了什么问题......
  • 目前尚未部署到生产环境中,我正在本地环境中进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多