gpt4 book ai didi

php - 从 Mysql 中检索数据很慢

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:32 24 4
gpt4 key购买 nike

我想根据用我的 PHP 代码编写的复杂查询从 MySQL 检索一些数据。检索数据的速度太慢了。我怎么解决这个问题?有什么办法可以提高性能吗?我正在使用 WAMP 服务器。我需要用 PHP 完成这一切,事实上,我想连接来自同一用户的所有推文,并将其推送到一个包含他/她名字的数组中。我使用 $twitter 数组来存储推特的名称,并且我将来自同一用户的所有推文连接到数据集中,如下所示:

$number_of_twitters=sizeof($twitters);

for($i=0;$i $number_of_twitters;$i++){
$getTweetsQuery="SELECT Tweets FROM tweettable WHERE Name='$twitters[$i]'";
$tweets=mysql_query($getTweetsQuery);

$tweetString="";

while($tweetsRow=mysql_fetch_array($tweets)){
$tweetString .= $tweetsRow[0]." ";
}

那么为什么要执行这么重的任务呢?

最佳答案

捕获应用程序发出的 SQL。如果您不能在应用程序中执行此操作,您可以启用 MySQL 通用日志,但这将记录所有 session 中的所有 sql 语句。

使用 EXPLAIN 查看生成的访问计划。

下意识的快速回答是“添加索引”,但关键是确定最合适的您正在运行的查询的索引,并消除不必要的索引。

您的查询中可能存在阻止最佳性能的谓词,例如,在函数中包装列会禁用 MySQL 执行索引范围扫描和索引查找。

另一个下意识的快速回答是向实例添加内存,以便缓存更多 block ,以减少物理 I/O。

MyISAM 存储引擎采用表级锁,即使是对 SELECT 语句也是如此,这会破坏并发性。 InnoDB 在并发查询方面表现得更好。


更新

最适合这个查询的索引:

SELECT Tweets FROM tweettable WHERE Name='$twitters[$i]'

将是一个覆盖索引:

... ON tweetable (Name, Tweets)

EXPLAIN 将显示当前的执行计划:

EXPLAIN SELECT Tweets FROM tweettable WHERE Name='foo'

理想情况下,我们希望解释输出显示“使用索引”。但至少,我们希望看到 MySQL 通过索引访问行,因此它不必对表中的每一行进行完整扫描以查看该行是否满足谓词。

这个查询似乎也处于循环中。使用单个语句检索一组行通常比运行多个语句更有效。 (当每次执行都从一个非常大的表中提取少量行,并且查询正在对表进行全面扫描时,情况尤其如此。)

SELECT t.Tweets
FROM tweetable t
WHERE t.Name = 'fee'
OR t.Name = 'fi'
OR t.Name = 'fo'
OR t.Name = 'fum'
ORDER BY t.Name

或等价物:

SELECT t.Tweets
FROM tweetable t
WHERE t.Name IN ('fee','fi','fo','fum')
ORDER BY t.Name

MySQL 还有一个 GROUP_CONCAT 函数,您可能会发现它很有用。

SELECT GROUP_CONCAT(t.Tweets ORDER BY t.Name SEPARATOR ' ') AS tweetstring
FROM tweetable t
WHERE t.Name IN ('fee','fi','fo','fum')

注意 GROUP_CONCAT 返回的字符串的长度受 group_concat_max_lenmax_allowed_pa​​cket 变量限制。

关于php - 从 Mysql 中检索数据很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22774333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com