2017-04-11 74 views
0

我有一個叫wallcitiescouncils視圖,從這個視圖返回值的過程。 我需要更快的respose,因此我想將此視圖更改爲Select語句,但目前沒有成功。更改MySQL視圖中的select語句

我需要的結果形成了兩個表,城市和議會,這是我的看法代碼:

CREATE OR REPLACE VIEW wallcitiescouncils AS 
SELECT 
    concat('p',cities.id) as id, 
    cities.name as name, 
    cities.country_id, 
    concat(cities.name,' (',councils.name,'), ',states.name,', ',countries.name) as fullname, 
    'City' as type 

FROM cities 
    JOIN countries ON (cities.country_id = countries.id) 
    JOIN states  ON (cities.state_id = states.id) 
    JOIN councils ON (cities.council_id = councils.id) 

UNION ALL 

SELECT 
    concat('c',councils.id) as id, 
    councils.name as name, 
    councils.country_id, 
    concat(councils.name,'(Council)') as fullname, 
    'Council' as type 

FROM councils 

而這一次我的程序:

BEGIN 
    SELECT name as city, id as city_id, fullname 
    FROM wallcitiescouncils 
    WHERE country_id = _country_id AND name LIKE CONCAT(search , '%') ORDER BY name LIMIT _limit; 
END 

我需要改變FROM wallcitiescouncils SELECT語句所以我不必調用視圖。

這是我的一個嘗試,但結果不正確(我沒有理事會的結果,並在'全名'總是得到相同的理事會名稱),我使用councils_id(只存在於城市表)嘗試知道,如果是一個城市或一個城市coucil:

SELECT 
    if(
     cities.council_id is null, 
     concat('c',councils.id), 
     concat('p',cities.id) 
     ) as id, 
    if(
     cities.council_id is null, 
     councils.name, 
     cities.name 
     ) as name, 

    if(
     cities.council_id is null, 
     councils.country_id, 
     cities.country_id 
     ) as country_id, 
    if(
     cities.council_id is null, 
     concat(councils.name,' (Municipio)'), 
     concat(cities.name,' (',councils.name,'), ',states.name,', ',countries.name) 
     ) as fullname 
FROM councils, cities 
    JOIN countries ON (country_id = countries.id) 
    JOIN states  ON (state_id = states.id) 
    /*JOIN councils ON (cities.council_id = councils.id)*/ 
where cities.id = 1 or councils.id = 1 limit 200 
+0

爲什麼你認爲改變視圖爲select語句會做什麼工作得更快?你的查詢中有一個'LIKE',你沒有發佈'EXPLAIN'的輸出,所以你是如何得出瓶頸在哪裏的? – Mjh

+0

[MySQL視圖作爲性能麻煩製造者(https://www.percona.com/blog/2007/08/12/mysql-view-as-performance-troublemaker/) – Devart

+0

@Devart你連接一個10歲的文章。有一種確定MySQL瓶頸的標準方法,每個問題都會重複一遍。讓我們這樣做,並獲得正確的信息,而不是猜測。 – Mjh

回答

1

嘗試此查詢firstly-

SELECT name as city, id as city_id, fullname FROM (
    SELECT 
    concat('p',cities.id) as id, 
    cities.name as name, 
    cities.country_id, 
    concat(cities.name,' (',councils.name,'), ',states.name,', ',countries.name) as fullname, 
    'City' as type 

    FROM cities 
    JOIN countries ON (cities.country_id = countries.id) 
    JOIN states  ON (cities.state_id = states.id) 
    JOIN councils ON (cities.council_id = councils.id) 

    UNION ALL 

    SELECT 
    concat('c',councils.id) as id, 
    councils.name as name, 
    councils.country_id, 
    concat(councils.name,'(Council)') as fullname, 
    'Council' as type 
    FROM councils 
) v 
WHERE 
    v.country_id = _country_id AND v.name LIKE CONCAT(search , '%') ORDER BY v.name LIMIT _limit;