2017-04-11 56 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;