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
为什么你认为改变视图为select语句会做什么工作得更快?你的查询中有一个'LIKE',你没有发布'EXPLAIN'的输出,所以你是如何得出瓶颈在哪里的? – Mjh
[MySQL视图作为性能麻烦制造者(https://www.percona.com/blog/2007/08/12/mysql-view-as-performance-troublemaker/) – Devart
@Devart你连接一个10岁的文章。有一种确定MySQL瓶颈的标准方法,每个问题都会重复一遍。让我们这样做,并获得正确的信息,而不是猜测。 – Mjh