2010-04-16 138 views
1

我有一個PHP MySQL查詢像這樣提高長MySQL查詢

$query = <<<EOS 
    SELECT * FROM articles 
     FORCE INDEX (articleindex) 
     WHERE category='$thiscat' AND did>'$thisdid' 
     AND mid!='$thismid' AND status='1' 
     AND group='$thisgroup' AND pid>'$thispid' 
     LIMIT 10 
EOS; 

作爲優選,我一直在索引所有articleindex的參數,我用武力指數強制MySQL使用索引,理應更快處理。

但似乎這個查詢仍然很慢,它導致了一個堵塞和最大的mysql連接限制。

如何改進這種長時間運行的查詢?

+1

索引'articleindex'的定義是什麼?特別是,什麼是列(以什麼順序)?你可能不應該使用'FORCE INDEX'。如果可能的話,MySQL將使用索引,如果它可能比表掃描更快。 – outis 2010-04-16 04:55:53

+0

另外,如果您在同一個腳本中多次執行此查詢,請使用準備好的語句。它們具有額外的優勢,即準備好的語句參數對SQL注入無懈可擊。 – outis 2010-04-16 04:57:06

+0

最後,如果您正在爲表瀏覽功能編寫DB客戶端,則應該只選擇所有列(http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select )。只選擇你需要的列。 – outis 2010-04-16 05:07:07

回答

1

強制articleindex上的索引很可能會傷害你,因爲你實際上並沒有在where子句中引用它。存在索引可以讓您快速找到具有特定值的行,從而加快搜索速度。如果沒有關於表格和其中包含的數據的更多細節,我無法給出更準確的答案,但是您絕對應該首先放棄部隊指數。如果這仍然很慢,也許你可以發佈EXPLAIN (your query)的結果。

0

希望你以前聽說過這一點,但如果有人向與

category="';drop table articles;" 

...請求你會怎麼做?請請使用準備好的語句與佔位符,將自動清理您的值,以防止人們處理您的數據庫。