我有以下简单的左连接查询:mysql的奇怪表现异常加入
SELECT SQL_NO_CACHE * FROM helyek h
LEFT JOIN eladok e ON e.elado_id = h.elado_id
LEFT JOIN eladok_rel_szakmak ersz ON ersz.elado_id = e.elado_id
LEFT JOIN szakmak sz ON sz.szakma_id = ersz.szakma_id
WHERE h.hely_nev = 'xy'
OR h.hely_telepules = 'xy'
每_id和h.hely_nev,h.hely_telepules被索引,并在0.0008秒运行。
但是,如果我再添加一个where子句(OR sz.szakma_id = 1),速度下降到0.7秒!这真的很慢。
SELECT SQL_NO_CACHE * FROM helyek h
LEFT JOIN eladok e ON e.elado_id = h.elado_id
LEFT JOIN eladok_rel_szakmak ersz ON ersz.elado_id = e.elado_id
LEFT JOIN szakmak sz ON sz.szakma_id = ersz.szakma_id
WHERE h.hely_nev = 'xy'
OR h.hely_telepules = 'xy'
OR sz.szakma_id = 1
在helyek,eladok,eladok_rel_szakmak和szakmak只有30行50k行。我需要加入所有表格,因为我需要一些场地。
问题是,我如何优化第二个查询来执行更好?
这里有解释:
这是快速查询:
+----+-------------+-------+-------------+------------------------------+------------------------------+---------+----------------+------+--------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------------+------------------------------+------------------------------+---------+----------------+------+--------------------------------------------------------+
| 1 | SIMPLE | h | index_merge | idxhelynev,idxhely_telepules | idxhelynev,idxhely_telepules | 482,482 | NULL | 2 | Using union(idxhelynev,idxhely_telepules); Using where |
| 1 | SIMPLE | e | eq_ref | PRIMARY | PRIMARY | 4 | h.elado_id | 1 | |
| 1 | SIMPLE | ersz | ref | elado_id | elado_id | 4 | e.elado_id | 1 | |
| 1 | SIMPLE | sz | eq_ref | PRIMARY | PRIMARY | 4 | ersz.szakma_id | 1 | |
+----+-------------+-------+-------------+------------------------------+------------------------------+---------+----------------+------+--------------------------------------------------------+
这是慢:
+----+-------------+-------+--------+------------------------------+----------+---------+----------------+-------------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+------------------------------+----------+---------+----------------+-------------+-------------+
| 1 | SIMPLE | h | ALL | idxhelynev,idxhely_telepules | NULL | NULL | NULL | 54326 | |
| 1 | SIMPLE | e | eq_ref | PRIMARY | PRIMARY | 4 | h.elado_id | 1 | |
| 1 | SIMPLE | ersz | ref | elado_id | elado_id | 4 | e.elado_id | 1 | |
| 1 | SIMPLE | sz | eq_ref | PRIMARY | PRIMARY | 4 | ersz.szakma_id | 1 | Using where |
+----+-------------+-------+--------+------------------------------+----------+---------+----------------+-------------+-------------+
我看到了第二个查询不能使用任何键,但我不知道为什么(有一个索引sz.szakma_id字段)
编辑:我忘了提及:我需要使用多个子句组。像这样:
(h.hely_nev = 'x' OR h.hely_telepules = 'x' OR sz.szakma_id = x)
AND
(h.hely_nev = 'y' OR h.hely_telepules = 'y' OR sz.szakma_id = y)
AND
(h.hely_nev = 'z' OR h.hely_telepules = 'z' OR sz.szakma_id = z)
这就是为什么我不能使用两个单独的查询。 目标是在h.hely_nev,h.hely_telepules,sz.szakma_id字段中搜索用户在搜索表单中输入的每个单词。 例如,如果用户输入“x y z”,我需要选择每个记录,其中h.hely_nev等于x或y或z,h.hely_telepules等于x或y或z等等。
使用2查询,而不是1 - 太多或公司会杀了 – matino