我有以下表格(示例)
t1 (20.000 rows, 60 columns, primary key t1_id)
t2 (40.000 rows, 8 columns, primary key t2_id)
t3 (50.000 rows, 3 columns, primary key t3_id)
t4 (30.000 rows, 4 columns, primary key t4_id)
sql查询:
SELECT COUNT(*) AS count FROM (t1)
JOIN t2 ON t1.t2_id = t2.t2_id
JOIN t3 ON t2.t3_id = t3.t3_id
JOIN t4 ON t3.t4_id = t4.t4_id
我已经在影响连接(例如 on t1.t2_id
)的列上创建了索引,并在必要时创建了外键。查询很慢(600 毫秒),如果我放置 where 子句(例如WHERE t1.column10 = 1
wherecolumn10
没有索引),查询会变得慢得多。我使用的查询select (*)
速度LIMIT
很快,但我无法理解计数行为。有什么解决办法吗?
编辑:添加解释 SQL
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t4 index PRIMARY user_id 4 NULL 5259 Using index
1 SIMPLE t2 ref PRIMARY,t4_id t4_id 4 t4.t4_id 1 Using index
1 SIMPLE t1 ref t2_id t2_id 4 t2.t2_id 1 Using index
1 SIMPLE t3 ref PRIMARY PRIMARY 4 t2.t2_id 1 Using index
其中 user_id 是 t4 表的列
编辑:我从 innodb 更改为 myisam 并且速度提高了,特别是如果我放置 where 子句。但是我仍然有时间(100-150 毫秒)我想在我的应用程序中计数的原因是对于正在处理搜索表单的用户,他期望使用 ajax 的结果数。可能有更好的解决方案,例如创建一个临时表,每隔一小时更新一次?