Sim*_*mon 5 php mysql performance join phpmyadmin
我有两张桌子 - incoming tours(id,name)和incoming_tours_cities(id_parrent, id_city)
id在第一个表中是唯一的,并且对于第一个表中的每个唯一行,id_city在第二个表中有- s列表(即id_parrent第二个表等于id第一个表)
例如
incoming_tours
|--id--|------name-----|
|---1--|---first_tour--|
|---2--|--second_tour--|
|---3--|--thirth_tour--|
|---4--|--hourth_tour--|
Run Code Online (Sandbox Code Playgroud)
incoming_tours_cities
|-id_parrent-|-id_city-|
|------1-----|---4-----|
|------1-----|---5-----|
|------1-----|---27----|
|------1-----|---74----|
|------2-----|---1-----|
|------2-----|---5-----|
........................
Run Code Online (Sandbox Code Playgroud)
这意味着first_tour有城市列表 -("4","5","27","74")
和second_tour有城市列表 -("1","5")
我们假设我有两个值 - 4并且74:
现在,我需要从第一个表中获取所有行,其中我的两个值都在城市列表中.即它必须只返回first_tour(因为4和74在它的城市列表中)
所以,我写了以下查询
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
Run Code Online (Sandbox Code Playgroud)
这很好.
但我动态生成查询,当连接数很大(大约15)时,查询速度变慢.
即当我试图跑
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
.........................................................
JOIN `incoming_tours_cities` tc15 ON tc15.id_parrent = t.id
AND tc15.id_city = 'some_value'
Run Code Online (Sandbox Code Playgroud)
查询运行45s(尽管我在表中设置了索引)
我能做些什么来优化呢?
非常感谢
SELECT t.name
FROM incoming_tours t INNER JOIN
( SELECT id_parrent
FROM incoming_tours_cities
WHERE id IN (4, 74)
GROUP BY id_parrent
HAVING count(id_city) = 2) resultset
ON resultset.id_parrent = t.id
Run Code Online (Sandbox Code Playgroud)
但是你需要改变总城市数量.