簡體   English   中英

如何使此mysqli查詢在PHP中運行得更快?

[英]How can i make this mysqli query run faster in PHP?

$ networks是用逗號分隔多個值的字符串。 范例:

$networks = "Programming,Movies,Hollywood". (There can be around 150 values or more.)    

現在,Mysql查詢在這里:

$query = "SELECT * FROM table 
          WHERE ( isActive = 1 AND 
                  isDeleted = 0 AND 
                  onid = '0' AND 
                  question = 0 AND 
                  ( ".$networkqur." )
                ) 
ORDER BY id DESC
LIMIT 0,100;

這里$ networkqur是:

$network = explode(',',$networks);

$networkqur = '';
for( $i = 0; $i < count($network); $i++ ){
    $networkqur .= 'networks LIKE "%'.$network[$i].'%"';
    if( $i != count($network) - 1 ){
        $networkqur .= ' OR ';
    }
}

因此,$ networkqur實際上變為:

$networkqur = "networks LIKE "%Programming%" OR 
               networks LIKE "%Movies%" OR 
               networks LIKE "%Hollywood%";

有效查詢變為:

$query = "SELECT * FROM posts
          WHERE ( isActive = 1 AND 
                  isDeleted = 0 AND 
                  onid = '0' AND 
                  question = 0 AND 
                   ( networks LIKE "%Programming%" OR 
                     networks LIKE "%Movies%" OR 
                     networks LIKE "%Hollywood% ) 
                   ) 
          ORDER BY id DESC
          LIMIT 0,100;

現在我們可以看到查詢中可以有150個OR條件,並在末尾有多個AND條件。
是否可以替換此特定查詢或任何其他更快的執行方式?

您在設計或數據庫中犯了一個嚴重的錯誤。 在設計數據庫時,應遵循六個數據庫規范化規則,並且您打破了第一個也是最重要的一個規則-在每一列中僅存儲一條信息。

除了在數據庫之上實現復雜的全文本索引系統之外,沒有其他方法可以優化當前設計。 此外,無法執行關系完整性(檢查是否僅存儲允許的network值。您無法為這些值建立索引,也無法在JOIN中使用它們。此外,還有一個嵌入式字符串問題,其中搜索(例如)“ Holly ”將與“霍莉”,“好萊塢”和“霍莉獵人”匹配。

相反,您應該將該networks列拆分為一個單獨的表名稱post_networks其中列post_idnetwork 在每個帖子和網絡組合中添加一行,在(post_id, network)上添加一個PRIMARY KEY (post_id, network)並可能在(network, post_id)上添加一個PRIMARY KEY,您將能夠更快,更安全地執行此查詢(以及更多操作)。

如果您的術語列表是相對固定的(即不是用戶生成的),那么這里的一種解決方案是建立自己的索引表,然后進行檢查。 如果在添加/編輯主數據時才建立索引的接觸點,則可以大大提高SELECT語句的速度。 因此,索引表將具有每個記錄的主鍵(理想情況下是PRIMARY KEY ),然后是您要查找的內容的引用。 然后,您可以將INDEX添加到term列,並且由於要在索引列上進行查找,因此速度應會急劇提高。

理想情況下,永遠不要對未索引的數據進行查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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