【问题标题】:SQL query is slow: indexes?SQL查询很慢:索引?
【发布时间】:2014-09-24 13:02:18
【问题描述】:

我有以下SQL查询,但是查询很慢:(页面加载2秒)。

mysql_query("select * from table_test 
WHERE ((owner = '$id' AND ownersecond = '0') OR ownersecond = '$id') 
AND catogory = '1' AND type = '$car[id]' AND caseB = '0' 
AND (timeback < TIMESTAMP(NOW()) OR timeback = '0000-00-00 00:00:00') ");

我想通过使用索引来改进 SQL 语句。我已经在该行上有一个索引:所有者和所有者第二。将索引放在 type、caseB 和 tieback 上是否有用?还是我越来越慢的sql?因为索引太多?

或者:将上面的 SQL 重写为更快的查询会更好吗?有没有人有更好的书面查询的建议。提前致谢。

【问题讨论】:

  • 旁注:您可能对 SQL 注入持开放态度。您需要使用参数化语句,否则您的数据库将被自动化工具所拥有。

标签: php sql indexing


【解决方案1】:

只关注查询(而不是过时的mysql_接口):

select *
from table_test 
WHERE ((owner = '$id' AND ownersecond = '0') OR ownersecond = '$id') AND
      catogory = '1' AND
      type = '$car[id]' AND
      caseB = '0' AND 
      timeback < TIMESTAMP(NOW()) OR timeback = '0000-00-00 00:00:00')

适当的索引位于categorytypecaseB,然后是其他列。所以试试这个索引:

create index idx_table_test_6 on table_test(category, type, caseB, timeback, owner, ownersecond)

该索引可用于所有where 条件,尽管select * 需要原始数据页。

【讨论】:

  • 值得注意的是,更多的索引 = 更长的写入时间。
  • 谢谢。我尝试了您的解决方案,它适用于当前页面:页面加载要快得多。你能告诉我这个索引会影响其他页面上的其他查询吗,例如当我只在另一个页面上这样做时? select * from table_test where owner = $id and category = '1' and type = '$car[id]'
  • 你需要一个不同的索引来达到这个目的。
【解决方案2】:

使用EXPLAIN 诊断正在使用的索引(如果有)。我建议学习如何使用 EXPLAIN,因为我们很难推荐一个额外的索引。如果我要猜测,我会说您的timeback 列需要索引,仅仅是因为时间戳列可能比@ 更多样化987654323@专栏。为每一列添加索引会增加插入/更新所需的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多