Php .$row->manufacturerid.“”; 回声“”; }

Php .$row->manufacturerid.“”; 回声“”; },php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,好吧,对于初学者来说,PDO与大型数据库的速度优化毫无关系。 为了更清楚一点,假设你问了一个类似于“如何驾驶我的福特Escort从纽约州布鲁克林到佛罗里达州坦帕”的问题。在这里,汽车制造与此无关。DB驱动程序也是如此 现在转到您的数据库。 你有很多工作要做 首先,绝对不能使用Mysql全文进行分类。它应该只是一个数字索引,链接到具有类别结构的表 因此,查询变得像这样 SELECT * FROM catalog WHERE category=1 AND special = 'YES' AND in

好吧,对于初学者来说,PDO与大型数据库的速度优化毫无关系。
为了更清楚一点,假设你问了一个类似于“如何驾驶我的福特Escort从纽约州布鲁克林到佛罗里达州坦帕”的问题。在这里,汽车制造与此无关。DB驱动程序也是如此

现在转到您的数据库。
你有很多工作要做

首先,绝对不能使用Mysql全文进行分类。它应该只是一个数字索引,链接到具有类别结构的表

因此,查询变得像这样

SELECT * FROM catalog WHERE category=1 AND special = 'YES' AND instock = 'YES' 
AND standardshippingcost=0 ORDER BY lastupdated DESC limit 3;
而且,如果索引正确,它可以非常快。比如说,如果特价商品的数量非常有限,那么无论数据库中有多少条记录,这个字段上的索引都会使它变得很快


但是,整个数据库体系结构可能会有所不同。还有其他的优化方法。但我们不知道你的项目有多少是确定的,老实说,这不是简单的问答形式的问题

编写一个名为
saveCacheData.php
的php脚本,该脚本执行该组sql查询,并将数据转储到名为
cacheData.php
的文件中

在主页上,将sql查询替换为
require\u once('cacheData.php')

现在,当mysql表
目录中的数据更新时,请确保也执行
file\u get\u contents('saveCacheData.php')
(或者执行某种cron作业,为您缓存数据)


顺便说一句,我确实认为您的DB设计可能会更好,但将DB数据缓存到磁盘通常也是一个好主意。

有一些问题,您可能不会喜欢我所说的

按text/varchar排序的速度非常慢,更新将花费很长时间。您应该做的是将所有文本转换为整数。因此,
广告商类别
中不应包含实际文本。相反,它应该是一个固定长度的
INT
,链接到存储实际文本的表。
special
instock
也是如此
standardshippingcost
看起来像一个varchar,因为它在单引号中,如果它是它看起来的样子,那么实际上不应该是这样。如果是数字,则应为数字。我不太确定您的模式,因此,
standardshippingcost
可能需要位于FK链接到
catalog
的自己的表中
lastupdated
在unix时间应为
INT

您的数据应该是
INT
的原因是1)它比
笔记本电脑占用更少的空间(因此排序时的内存更少)-其他
和2)更新速度更快(我假设您使用的是InnoDB)

因此,排序时,
选择所有
id
s(应该是一个自动递增的
PRIMARY
)、
广告商类别
instock
standardshippingcost
standardshippingcost
lastupdated
,并将其放入PHP数组中。找到最有效的方式得到你想要的(你会找到捷径)。最后,
PRIMARY
键选择特定数据

我会倒回去解释。这种方法将产生最高性能的原因是,如果在没有任何其他索引的InnoDB表上
选择
关闭
,不管表有多大,它都会“立即”返回。正如您所经历的那样,使用大型、深奥的查询速度很慢。这就是实际检索数据的方式

PHP在逻辑方面比MySQL快。这就是它的目的。堆栈上有许多Qs显示了这一点。这就是为什么要在PHP上排序。另外,如果您在数据中看到某种统计或其他类型的模式,您实际上可以编写更好的算法,使排序运行得更快

除了unix日期之外,您的其他列不应该太长
Advertiser类别可能会变得有点大,但与
notebook pc-other
相比,它不会是任何东西,后者的长度已经是
19
。我在你的Q中看到大约30个
广告商类别
s,所以这只是一个
INT
长度
2
,因为这是100个潜在值。这将在排序时节省空间和内存

此外,在更新时使用固定长度的整数将更快,因为集群表将始终保持紧凑和碎片整理。如果您的代码>更新< /COD>一个集群中的UnIDB中的一行,从代码>内存(USB闪存驱动器)'<代码> >代码> >投影机'/COD>,您只需使您的数据库对整个数据库进行碎片整理,以删除刚才所做的间隙。如果在固定长度的int列中从一个
1
更改为
10
,则不会执行此操作,因为两者占用相同的空间量,不会产生间隙,因此不需要对集群进行碎片整理

当您这样做时,您会对性能的大幅提高感到震惊,但是是的,这将涉及更多的代码。那么您的优先级是什么,性能还是开发时间



哇!忘记了时间的解释。您想使用它是因为您可以将它存储在
INT
中几秒钟,存储在
DECIMAL
中几微秒。这样做可以在PHP中实现最简单的操作,因为PHP在unix中。

是的,我主要是一个前端开发人员。开始进入后端。我正在接收xml巨大的xml文件,所以我只是在数据库中创建字段并解析它们。我需要创建多个表,为数据编制索引会有所帮助。你能给我举个例子吗?thks
#fetch data
require_once('db_config.php');
$STH = $DBH->query("
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('notebook pc - other') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Desktop PC') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Hard Drives - External') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Camcorders - Analog/Digital') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Monitors - LCD Flat Panel') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Software - PC Games') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('third party accessories') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE advertisercategory LIKE ('LED TV') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 3;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Motherboards - %') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE advertisercategory LIKE ('LED TV') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Hard Drives - External') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('CPU Cooling') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('CPU Thermal Paste / Grease') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Keyboards') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Memory (USB Flash Drive)') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Memory (Desktop Memory)') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Memory (Notebook Memory)') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Mouse') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Printer - Inkjet Printers') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Projectors') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;
SELECT name, buyurl, imageurl, price, manufacturer, manufacturerid FROM catalog WHERE MATCH advertisercategory AGAINST ('Processors - Desktops') AND special = 'YES' AND instock = 'YES' AND standardshippingcost LIKE '0' ORDER BY lastupdated DESC limit 9;

");

$STH->setFetchMode(PDO::FETCH_OBJ);

while ($row = $STH->fetch()) {
echo "<ul>";
echo "<li>" .$row->name ."</li>";
echo "<li>" .$row->buyurl ."</li>";
echo "<li>" .$row->imageurl ."</li>";
echo "<li>" .$row->price ."</li>";
echo "<li>" .$row->manufacturer ."</li>";
echo "<li>" .$row->manufacturerid ."</li>";
echo "</ul>";
}
SELECT * FROM catalog WHERE category=1 AND special = 'YES' AND instock = 'YES' 
AND standardshippingcost=0 ORDER BY lastupdated DESC limit 3;