gpt4 book ai didi

PHP - 从 MySQL 数据库循环结果时页面加载缓慢

转载 作者:行者123 更新时间:2023-11-29 18:00:25 24 4
gpt4 key购买 nike

我有 php 代码,它从 MySQL 数据库获取结果 - 用户的玩具名称(在 toys 表中)以及玩具和唯一用户的计数 并显示在网页上。

玩具的名称可以是一个单词,也可以是单词的组合。我们希望从 toys 中获取这些结果,该字段具有 toys_text 字段,该字段包含 words 表中单词组合的所有单词(示例 - 如果 >words 表中有名为 blue car 的条目 - bluecar 都应该出现在 toys 中> 表 toys_text 匹配字段)。数据库随着时间的推移而变化,新玩具的用户被添加,过时的玩具则被删除。

生成的页面加载速度非常慢,在 GT-metrix 测试中大约需要 10 秒以上。谷歌分析说我的代码有问题。我的代码有如下子查询 -

<?php
$WordQ = $db->query("SELECT * FROM words ORDER BY `words`.`words` ASC");

$i = 1;
while($row = $WordQ->fetch(PDO::FETCH_ASSOC)){
$Word = $row['words'];
$WordsArr = explode(" ", $row['words']);

$query = "";
if(count($WordsArr) > 1){
$query = "SELECT t_id,name,toys_text FROM toys WHERE toys_text
LIKE '%".implode("%' AND toys_text LIKE '%", $WordsArr)."%'";
}else{
$query = "SELECT t_id,name,toys_text FROM toys WHERE toys_text
LIKE '%$WordsArr[0]%'";
}
$countIds = array();
$countNames = array();
$Data = $db->query($query);
while($data = $Data->fetch(PDO::FETCH_ASSOC)){
$countIds[] = $data['t_id'];
$countNames[] = $data['name'];
}
?>
<tr>
<td><?php echo $i;?></td>
<td><?php echo $row['words'];?></td>
<td><a href="showtoys.php?word=<?php echo urlencode($Word); ?
>" target="_blank"><?php echo count(array_unique($countIds)); ?>
</a></td>
<td><a href="showtoys.php?word=<?php echo urlencode($Word); ?
>" target="_blank"><?php echo count(array_unique($countNames));
?></a></td>
</tr>
<?php $i++;} ?>

我尝试删除子查询,但页面加载速度仍然很慢。请指导如何使页面加载更快。以下是没有子查询的代码 -

<?php
$query = "SELECT * FROM words ORDER BY `words`.`words`
ASC";
$result = mysqli_query($con, $query);

$i = 1;
while($row = mysqli_fetch_array($result)){
$Word = $row['words'];
$WordsArr = explode(" ", $row['words']);
$query = "";
if(count($WordsArr) > 1){
$query1 = "select COUNT(*) as 'count', COUNT(DISTINCT
t.name) AS 'cnt' from toys t WHERE toys_text LIKE '%".implode("%' AND
toy_text LIKE '%", $WordsArr)."%'";
}else{
$query1 = "select COUNT(*) as 'count', COUNT(DISTINCT t.name) AS
'cnt' from toys t WHERE
toys_text LIKE '%$WordsArr[0]%'";
}
$Data1 = mysqli_query($con, $query1);
$total1 = mysqli_fetch_assoc($Data1);
?>
<tr>
<td><?php echo $i;?></td>
<td><?php echo $row['words'];?></td>
<td><a href="showtoys.php?word=<?php echo
urlencode($Word); ?>" target="_blank"><?php echo
$total1['count']; ?></a></td>
<td><a href="showtoys.php?keyword=<?php echo urlencode($Word);
?>" target="_blank"><?php echo $total1['cnt']; ?></a></td>
</tr>
<?php $i++;} ?>

这是我的 MySQL 表结构 -

单词:

S.No 名称类型

  1. id 主 int(11)

  2. 单词 varchar(60)

    示例 - 白色汽车、气球、蓝色巴士

  3. 类型 enum('words', 'phrase')

玩具:

S号名称类型

  1. t_id 主要 bigint(20)

  2. toys_text FULLTEXT 索引 varchar(255)

  3. user_id BTREE 索引 bigint(20)

  4. 名称 BTREE 索引 char(20)

Mysql是10.1.30-MariaDB,带有InnoDB存储。

编辑 -

假设我在words表中有一个名为小蓝车的玩具。那么真正的匹配将是 -我有一辆汽车,它是蓝色。我的蓝色汽车速度非常快。

错误匹配将是 -

我有一辆小车。我的小车非常好。

这意味着所有单词都应该出现在 toys_text 字段中才能真正匹配。

我将查询更改为

if(count($WordsArr) > 1){ 
$query1 = "select COUNT() as 'count',
COUNT(DISTINCT t.name) AS 'cnt' from toys t WHERE MATCH (toys_text) AGAINST
('".implode("'+'", ($WordsArr))."' IN BOOLEAN MODE)";
}else{
$query1 = "select COUNT() as 'count', COUNT(DISTINCT t.name) AS 'cnt' from
toys t WHERE MATCH (toys_text) AGAINST ('%$WordsArr[0]%')";

现在,对于计数较多的单词和单词组合,它的计数为 0。这些词不在Mysql的非索引字表中。这是全文搜索的一些限制吗?

最佳答案

您正在循环中从 SQL 语句的输出生成并运行 SQL。只需在查询之间进行连接,一次到数据库的往返,一次循环以显示结果。

关于PHP - 从 MySQL 数据库循环结果时页面加载缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48413566/

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