提高长MySQL查询

问题描述:

我有一个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://*.com/questions/321299/what-is-the-reason-not-to-use-select )。只选择你需要的列。 – outis 2010-04-16 05:07:07

强制articleindex上的索引很可能会伤害你,因为你实际上并没有在where子句中引用它。存在索引可以让您快速找到具有特定值的行,从而加快搜索速度。如果没有关于表格和其中包含的数据的更多细节,我无法给出更准确的答案,但是您绝对应该首先放弃部队指数。如果这仍然很慢,也许你可以发布EXPLAIN (your query)的结果。

希望你以前听说过这一点,但如果有人向与

category="';drop table articles;" 

...请求你会怎么做?请请使用准备好的语句与占位符,将自动清理您的值,以防止人们处理您的数据库。