【发布时间】: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