【问题标题】:SQL query takes very longSQL查询需要很长时间
【发布时间】:2015-12-17 14:37:08
【问题描述】:

我有一个名为 Ads 的表格,其中包含约 441.000 行和 21 列。

我正在尝试运行以下查询:

SELECT Ads.* FROM Ads WHERE Ads.countries_CountryId = 'FR'

我在 countries_CountryId 字段中添加了一个索引,该字段的类型为 char(2),但是当我运行上述查询时,大约需要 5-8 秒才能完成。对于我来说,对于这样一个中等大小的表和这样一个简单的 SQL 查询来说,这个时间量看起来非常高。我应该在哪里寻找问题?或者这样的查询需要这么长时间是正常的吗?

我也试过EXPLAIN上面的查询,得到如下结果,但不知道怎么破译:(

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  Ads     ref     countries_CountryId     countries_CountryId     2   const   24368   Using where

EDIT1:(回复 Seth McClaine)

我已经尝试过您的建议,按照您建议的方式返回错误,但如果我运行 SELECT count(*) FROM Ads WHERE Ads.countries_CountryId = 'FR',它运行得更快:0.0052490234375

但问题是,我没有打印任何内容,我正在使用 php 运行查询,并计算它们的运行时间,最后输出查询运行以及它们花费的时间:

 Array
(
[0] => Array
    (
        [query] => SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'
        [duration] => 0.00481009483337
    )

[1] => Array
    (
        [query] => SELECT * FROM Countries WHERE NameFormatted LIKE '%FRANCE%'
        [duration] => 0.00234889984131
    )

[2] => Array
    (
        [query] => SELECT Ads.* FROM Ads WHERE Ads.countries_CountryId = 'FR'
        [duration] => 4.71820402145
    )

[3] => Array
    (
        [query] => SELECT COUNT(*) FROM Ads WHERE Ads.countries_CountryId = 'FR'
        [duration] => 0.0052490234375
    )
)

这也是运行查询的代码 sn-p:

 public function query($query, $cacheit=true) {
    if (!$this->isConnected()) {
        $this->throwError("Querying <b>".$query."</b> failed, because MySQL is not connected!", self::MYSQL_NOT_CONNECTED, false);
        return false;
    }

    $qstart=microtime(true);
    $result=@mysql_query($query, $this->conn_resource);
    $qduration=microtime(true) - $qstart;

    if ($result===FALSE) $this->throwError("Querying <b>".$query."</b> failed!", self::MYSQL_QUERY_ERR);

    $this->numQueries++;
    $this->executedQueries[] = array(
        'query'     =>  $query,
        'duration'  =>  $qduration
    );

    return $result;
}

【问题讨论】:

  • 它可能不是单独的查询,可能还有其他一些因素可能导致输出响应缓慢。例如,数据库所在机器的规格是什么?是否有其他并发(可能是进程密集型)作业/进程同时运行?
  • 如果您正在打印,可能是实际打印需要很长时间...尝试运行SELECT count(Ads.*) FROM Ads WHERE Ads.countries_CountryId = 'FR',看看您的速度是否显着提高
  • 此表是否经常更改?碎片可能是问题......另外,你真的需要这个查询中的所有这 21 列吗?
  • 即使您只是显示运行时,您仍然需要在匹配行中传输这 21 列的所有数据。尝试只选择主键列。它的运行时间是多少?比如:SELECT id FROM Ads WHERE countries_CountryId = 'FR'?如果速度很快,那么您的列数据很可能是问题所在。
  • 只选择特定列是否也加快了进程? (即使您在为每个返回的字段运行选择时不打印列......它从 sql 传输到网络服务器并为其分配空间...... . 有 21 列它可能是(取决于字段本身)这是一个时间杀手....例如许多大文本字段非常填充))

标签: mysql


【解决方案1】:

您是否尝试过以只读模式执行查询? 正如 mysql 文档中的 here 所解释的那样。 您可以尝试使用

开始查询
START TRANSACTION READ ONLY

此外,您可能想尝试使用说明语句来获取有关您的查询的更多信息。

EXPLAIN SELECT Ads.* FROM ....

希望这会有所帮助。在几个大型查询中为我提供了帮助。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多