我有以下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重写为更快的查询是否更好?有没有人建议更好的书面查询。提前致谢。
答案 0 :(得分: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')
适当的索引位于category
,type
,caseB
,然后是其他列。所以试试这个指数:
create index idx_table_test_6 on table_test(category, type, caseB, timeback, owner, ownersecond)
索引可用于所有where
条件,但select *
需要原始数据页。
答案 1 :(得分:0)
使用EXPLAIN来诊断正在使用的索引(如果有)。我建议学习如何使用EXPLAIN,因为我们很难推荐一个额外的索引。如果我要 猜测 ,我会说您的timeback
列需要索引,因为时间戳列可能更多不同于owner
列。向每列添加索引将增加INSERT / UPDATE所需的时间。