【发布时间】:2015-06-30 10:15:56
【问题描述】:
更新:
感谢所有帮助。我会总结答案。
来自@Jaydee,他的回答成功地将结果减少到 0.09 秒,并且与 LIMIT 中的数字成线性关系。
select * from (select table1.id as table1_id from table1 where table1.id
来自@Rick James,他提到这可能是表 2 的问题。因为我的表 2 只有几列,所以我可以将其省略,并自己进行连接,即使在客户端也是如此!
所以我把表2去掉,只有0.02s!
选择
table1.idastable1_idfromtable1left jointable3在table1.table3_id=table3.id其中table1.idtable1.iddesc limit 1000 排序;
最后我发现,如果我把table2从inner join改为left join,那么所有的痛苦都消失了,就是0.03s!
从
table1中选择table1.id作为table1_id左加入table2在table1.table2_id=table2.id左加入table3table1.table3_id=table3.id其中table1.id100000 按table1.iddesc limit 1000 排序;
再次感谢您的帮助!
================================
注意:我在嵌入式服务器上运行,内存有限(大约 1G,实际上足以放入所有数据,200,000 条数据)并使用 SD 卡作为存储。
select table1.id from table1 where id
(0.01s)
从
table1中选择table1.id作为table1_id内部连接table2在table1.table2_id=table2.id其中table1.id100000 order bytable1.iddesc limit 1000;
(0.40 秒)
从
table1中选择table1.id作为table1_id内部连接table2在table1.table2_id=table2.id其中table1.id1000 按table1.iddesc limit 1000 排序;
(0.01s)
从
table1中选择table1.id作为table1_id内部连接table2在table1.table2_id=table2.id左加入table3table1.table3_id=table3.id其中table1.id100000 按table1.iddesc limit 1000 排序;
(2.31 秒)
从
table1中选择table1.id作为table1_id内部连接table2在table1.table2_id=table2.id左加入table3table1.table3_id=table3.id其中table1.id1000 顺序 bytable1.iddesc limit 1000;
(0.03s)
正如评论所建议的,我使用了解释,但我真的不明白解释说什么。请帮我检查。以下是最长的2.31s。
+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+
| 1 | SIMPLE | table2 | index | PRIMARY,table2_id_index | table1_id_index | 4 | NULL | 1 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | table1 | ref | PRIMARY,table1_table2_id_foreign,table1_id_index | table1_table2_id_foreign | 4 | videocap.table2.id | 27222 | Using where |
| 1 | SIMPLE | table3 | eq_ref | PRIMARY | PRIMARY | 4 | videocap.table1.table3_id | 1 | Using index |
+----+-------------+----------------------+--------+-------------------------------------------------------------------+---------------------------------------+---------+---------------------------------------------+-------+----------------------------------------------+
来自 desc 表的结果
表1:
+-------------------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| table2_id | int(10) unsigned | NO | MUL | NULL | |
| table3_id | int(10) unsigned | NO | MUL | 0 | |
| created_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 | |
+-------------------------+------------------+------+-----+---------------------+----------------+
表2:
+-----------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 | |
+-----------------+------------------+------+-----+---------------------+----------------+
表3:
+---------------------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------------+------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created_at | timestamp | NO | | 0000-00-00 00:00:00 | |
| updated_at | timestamp | NO | | 0000-00-00 00:00:00 | |
+---------------------------+------------------+------+-----+---------------------+----------------+
【问题讨论】:
-
explain select对所有慢查询说什么?连接键是否已编入索引? -
table1.id上有索引吗? -
table1.id, table2.id, table3.id 是主键。 table1.table2_id, table1.table3_id 是普通索引(来自 desc table1 的mul)。
-
显示带有索引的架构(非手工输入)和解释的输出
-
垃圾进垃圾出你懂钻
标签: mysql database join query-optimization