[英]Optimizing SQL queries with php
數據庫中的700,000個元素我有一個關於id的索引我也有一個關於省的索引,一個長度為30的varchar(雖然我認為最大省份的名字長度為12)
所以
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。
省份清單應該簡短,不應經常更改。 創建一個省表並加入它,這樣你就可以在一個相對較小的表上進行通配符搜索,並在你的大表上進行完全索引搜索。
您的架構中存在多個問題。
這個特定的查詢可以通過例如(Type, Category, Price, Bed)
的多列索引進行優化,但是在大多數情況下,這可能對你沒什么好處,因為這些標准都不具備選擇性 - 更不用說了相關性。 (事實上,如果索引被使用,我會感到驚訝,除了在邊緣情況下,因為與順序掃描相比,讀取索引的成本太高了。)
選擇標准是省,但由於您在未錨定的字符串上使用like語句(例如,它以通配符開頭),因此您不能在其上使用BTree索引。 臨時修復可能是添加已建議的全文索引。 從長遠來看,您實際上希望以允許空間索引的格式存儲此信息:
http://dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.