提高长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连接限制。
如何改进这种长时间运行的查询?
答
强制articleindex上的索引很可能会伤害你,因为你实际上并没有在where子句中引用它。存在索引可以让您快速找到具有特定值的行,从而加快搜索速度。如果没有关于表格和其中包含的数据的更多细节,我无法给出更准确的答案,但是您绝对应该首先放弃部队指数。如果这仍然很慢,也许你可以发布EXPLAIN (your query)
的结果。
答
希望你以前听说过这一点,但如果有人向与
category="';drop table articles;"
...请求你会怎么做?请请使用准备好的语句与占位符,将自动清理您的值,以防止人们处理您的数据库。
索引'articleindex'的定义是什么?特别是,什么是列(以什么顺序)?你可能不应该使用'FORCE INDEX'。如果可能的话,MySQL将使用索引,如果它可能比表扫描更快。 – outis 2010-04-16 04:55:53
另外,如果您在同一个脚本中多次执行此查询,请使用准备好的语句。它们具有额外的优势,即准备好的语句参数对SQL注入无懈可击。 – outis 2010-04-16 04:57:06
最后,如果您正在为表浏览功能编写DB客户端,则应该只选择所有列(http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select )。只选择你需要的列。 – outis 2010-04-16 05:07:07