[英]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_id
和network
。 在每個帖子和網絡組合中添加一行,在(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.