数据库中的700,000个元素 我有一个关于id的索引 我也有省的索引,长度为30的varchar(虽然我认为最大省份的长度为12)
SO
Create table (
id serial primary key watever,
price double not null,
address varchar(200)not null,
province varchar(30)not null,
description text not null,
status varchar(8) not null,
type varchar(30) not null,
category text not null,
size int(11) not null,
bultin int(4),
bed int(2),
bath int(2),
extras text,
posted_by int foregin key(user.id or whatever)
);
此页面大约需要2秒
$sqlquery = "SELECT DESCRIPTION, ADDRESS, SIZE, BUILTIN, BED, BATH, PRICE
FROM listings
WHERE PRICE BETWEEN $min and $max AND BED between $minbr AND $maxbr AND CATEGORY =
'$cat' AND TYPE = '$type' AND PROVINCE like '%$province%'";
while ($row = mysqli_fetch_array($listings)) {
echo $row['DESCRIPTION'] . " Located at " . $row['ADDRESS'] . " " . $province. " "
. $row['SIZE'] . " sqft" . ", built in " . $row['BUILTIN'] . " " . $row['BED'] . "Bedroom, "
. $row['BATH'] . " Bathroom for $" . $row['PRICE'] . "
<br>
";
我已经阅读了一些关于提高SQL查询效率的教程,但是它们并没有改变正在发生的事情的速度。 (也许所有的速度丢失都在PHP?!?我认为这是非常可能的,如果是这样的话我怎样才能优化php?)
编辑:在phpmyadmin上运行查询,只需运行php页面即可。问题显然是查询而不是PHP。答案 0 :(得分:1)
如果您不知道索引是如何工作的,那么在WHERE
和ORDER BY
部分中使用的所有列上添加索引将是一个开始。这远非最佳,但在大多数情况下它是一种改进。最好是检查explain或使用optimizer。
首先,请确保Price
,Bed
,Category
和Type
上还有一个索引。
另一件事是您提到index
列上有Province
,但遗憾的是,如果您在开头使用带有通配符的LIKE
,则不会使用它。它只会使用带有索引的第一个通配符之前的部分。所以基本上这将是一个全表扫描,无论你有什么索引。
您可以尝试使用FULLTEXT索引来加快速度。
答案 1 :(得分:1)
省份清单应该简短,不应经常更改。创建一个省表并加入它,这样你就可以在一个相对较小的表上进行通配符搜索,并在你的大表上进行完全索引搜索。
答案 2 :(得分:0)
您的架构中存在多个问题。
此特定查询可以使用例如多列索引进行优化。 (Type, Category, Price, Bed)
,但是在大多数情况下,imho可能对你没有什么好处,因为这些标准都不具备选择性 - 更不用说相关性了。 (事实上,如果索引完全被使用,我会感到惊讶,除了边缘情况,因为与顺序扫描相比,读取索引的代价太高了。)
选择标准是省,但由于您在非锚定字符串上使用like语句(例如,它以通配符开头),因此您不能在其上使用BTree索引。临时修复可能是添加已建议的全文索引。从长远来看,您实际上希望以允许空间索引的格式存储此信息:
http://dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html