如何优化此 MySQL 查询 - 在视图内?性能调优
How to optimize this MySQL Query - inside a view? Performance tuning
我有一个包含一些 n:m 关系表的数据库,我正在使用一个非常大的查询来组合所有这些表。先来看看我的数据库:
我创建了两个视图来比较性能。
第一个视图:
CREATE VIEW `band_page1` AS (
SELECT maid, band_name, band_logo, band_img,
(SELECT countries.country_name from countries WHERE band_info.id_country = countries.id) as country,
(SELECT locations.location_name from locations WHERE band_info.id_location = locations.id) as location,
(SELECT status.status_name from status WHERE band_info.id_status = status.id) as status,
(SELECT founding.fyear from founding WHERE band_info.id_founding = founding.id) as founding,
(SELECT active.ayear from active WHERE band_info.id_active = active.id) as active,
(SELECT GROUP_CONCAT(DISTINCT genres.genre_name ORDER BY genres.genre_name)
FROM genres LEFT JOIN band_genres ON band_genres.id_genre = genres.id
WHERE band_genres.id_band = band_info.maid) AS genre,
(SELECT GROUP_CONCAT(DISTINCT themes.theme_name ORDER BY themes.theme_name)
FROM themes LEFT JOIN band_themes ON band_themes.id_theme = themes.id
WHERE band_themes.id_band = band_info.maid) AS themes,
(SELECT GROUP_CONCAT(DISTINCT labels.label_name ORDER BY labels.label_name)
FROM labels LEFT JOIN band_labels ON band_labels.id_label = labels.id
WHERE band_labels.id_band = band_info.maid) AS label
FROM band_info
GROUP BY band_info.maid);
第二个视图:
CREATE VIEW `band_page2` AS (
SELECT band_info.maid, band_info.band_name, band_info.band_logo, band_info.band_img,
(SELECT countries.country_name from countries WHERE band_info.id_country = countries.id) as country,
(SELECT locations.location_name from locations WHERE band_info.id_location = locations.id) as location,
(SELECT status.status_name from status WHERE band_info.id_status = status.id) as status,
(SELECT founding.fyear from founding WHERE band_info.id_founding = founding.id) as founding,
(SELECT active.ayear from active WHERE band_info.id_active = active.id) as active,
GROUP_CONCAT(DISTINCT genres.genre_name ORDER BY genres.genre_name) AS genre,
GROUP_CONCAT(DISTINCT themes.theme_name ORDER BY themes.theme_name) AS themes,
GROUP_CONCAT(DISTINCT labels.label_name ORDER BY labels.label_name) AS label
FROM band_info
LEFT JOIN band_genres ON band_genres.id_band = band_info.maid
LEFT JOIN band_themes ON band_themes.id_band = band_info.maid
LEFT JOIN band_labels ON band_labels.id_band = band_info.maid
LEFT JOIN genres ON genres.id = band_genres.id_genre
LEFT JOIN themes ON themes.id = band_themes.id_theme
LEFT JOIN labels ON labels.id = band_labels.id_label
GROUP BY band_info.maid);
当我转到 phpmyadmin 并打开一个视图时,两个视图都需要 3 秒才能显示查询结果。我正在使用此视图进行如下查询:
SELECT * FROM band_page1 where maid = '$id';
php 感觉好像要花很长时间才能得到结果。
这不仅需要 3 秒,还需要更长的时间。
我的问题是,如何优化我的查询?
有"over-normalization"这样的东西。
标准 "country codes" 是 2 个字母。让他们 CHAR(2) CHARACTER SET ascii
,而不是 INT
到另一个 table。这将该列从 4 个字节减少到 2 个。并摆脱了查找。
YEAR
是一个 2 字节的数据类型;不要费心规范化。
考虑将 status
转换为 1 字节 ENUM
而不是查找。
可能还有其他人。
VIEWs
是语法糖,从不提高性能。有时性能明显更差。
我不认为 GROUP BY
在 first VIEW
.
中有任何用处
band_*
table好像是多对多映射table。通过遵循 these tips.
可以提高他们的表现
我有一个包含一些 n:m 关系表的数据库,我正在使用一个非常大的查询来组合所有这些表。先来看看我的数据库:
我创建了两个视图来比较性能。
第一个视图:
CREATE VIEW `band_page1` AS (
SELECT maid, band_name, band_logo, band_img,
(SELECT countries.country_name from countries WHERE band_info.id_country = countries.id) as country,
(SELECT locations.location_name from locations WHERE band_info.id_location = locations.id) as location,
(SELECT status.status_name from status WHERE band_info.id_status = status.id) as status,
(SELECT founding.fyear from founding WHERE band_info.id_founding = founding.id) as founding,
(SELECT active.ayear from active WHERE band_info.id_active = active.id) as active,
(SELECT GROUP_CONCAT(DISTINCT genres.genre_name ORDER BY genres.genre_name)
FROM genres LEFT JOIN band_genres ON band_genres.id_genre = genres.id
WHERE band_genres.id_band = band_info.maid) AS genre,
(SELECT GROUP_CONCAT(DISTINCT themes.theme_name ORDER BY themes.theme_name)
FROM themes LEFT JOIN band_themes ON band_themes.id_theme = themes.id
WHERE band_themes.id_band = band_info.maid) AS themes,
(SELECT GROUP_CONCAT(DISTINCT labels.label_name ORDER BY labels.label_name)
FROM labels LEFT JOIN band_labels ON band_labels.id_label = labels.id
WHERE band_labels.id_band = band_info.maid) AS label
FROM band_info
GROUP BY band_info.maid);
第二个视图:
CREATE VIEW `band_page2` AS (
SELECT band_info.maid, band_info.band_name, band_info.band_logo, band_info.band_img,
(SELECT countries.country_name from countries WHERE band_info.id_country = countries.id) as country,
(SELECT locations.location_name from locations WHERE band_info.id_location = locations.id) as location,
(SELECT status.status_name from status WHERE band_info.id_status = status.id) as status,
(SELECT founding.fyear from founding WHERE band_info.id_founding = founding.id) as founding,
(SELECT active.ayear from active WHERE band_info.id_active = active.id) as active,
GROUP_CONCAT(DISTINCT genres.genre_name ORDER BY genres.genre_name) AS genre,
GROUP_CONCAT(DISTINCT themes.theme_name ORDER BY themes.theme_name) AS themes,
GROUP_CONCAT(DISTINCT labels.label_name ORDER BY labels.label_name) AS label
FROM band_info
LEFT JOIN band_genres ON band_genres.id_band = band_info.maid
LEFT JOIN band_themes ON band_themes.id_band = band_info.maid
LEFT JOIN band_labels ON band_labels.id_band = band_info.maid
LEFT JOIN genres ON genres.id = band_genres.id_genre
LEFT JOIN themes ON themes.id = band_themes.id_theme
LEFT JOIN labels ON labels.id = band_labels.id_label
GROUP BY band_info.maid);
当我转到 phpmyadmin 并打开一个视图时,两个视图都需要 3 秒才能显示查询结果。我正在使用此视图进行如下查询:
SELECT * FROM band_page1 where maid = '$id';
php 感觉好像要花很长时间才能得到结果。 这不仅需要 3 秒,还需要更长的时间。 我的问题是,如何优化我的查询?
有"over-normalization"这样的东西。
标准 "country codes" 是 2 个字母。让他们 CHAR(2) CHARACTER SET ascii
,而不是 INT
到另一个 table。这将该列从 4 个字节减少到 2 个。并摆脱了查找。
YEAR
是一个 2 字节的数据类型;不要费心规范化。
考虑将 status
转换为 1 字节 ENUM
而不是查找。
可能还有其他人。
VIEWs
是语法糖,从不提高性能。有时性能明显更差。
我不认为 GROUP BY
在 first VIEW
.
band_*
table好像是多对多映射table。通过遵循 these tips.