簡體   English   中英

使用php優化SQL查詢

[英]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。

如果您不知道索引是如何工作的,那么在WHEREORDER BY部分中使用的所有列上添加索引將是一個開始。 這遠非最佳,但在大多數情況下它是一種改進。 更好的是檢查解釋或使用優化器

因此,首先要確保PriceBedCategoryType也有一個指數。

另一件事是你提到你的Province列上有一個index ,但不幸的是,如果你在開頭使用LIKE和通配符,就不會使用它。 它只會使用帶有索引的第一個通配符之前的部分。 所以基本上這將是一個全表掃描,無論你有什么索引。

您可以嘗試使用FULLTEXT索引來加快速度。

省份清單應該簡短,不應經常更改。 創建一個省表並加入它,這樣你就可以在一個相對較小的表上進行通配符搜索,並在你的大表上進行完全索引搜索。

您的架構中存在多個問題。

這個特定的查詢可以通過例如(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM