Mysql
MySQL 5.6 - 查詢性能問題。尋找蛞蝓
我有一個案例,我不知道如何提高此查詢的性能。
這是對Geonames.org數據庫的簡單查詢。
查詢:
SELECT name, latitude, longitude FROM geoname WHERE slugify(geoname.name) = 'lisboa' and geoname.country = 'PT' and geoname.fclass in ('A', 'T')
解釋:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra 1, SIMPLE, geoname, ref, fclass,country, country, 11, const, 73462, Using index condition; Using where
我知道問題是這個where 子句:
slugify(geoname.name) = 'lisboa'
我無法索引這個。slugify ()是一個 MySQL 函式,用於對地名進行 slugify,例如New York變為new-york。
在這種情況下,我應該考慮哪些選項以獲得更好的性能。我能做些什麼?
升級到 MySQL-5.7,然後升級到 MySQL-8.0(為了安全,一次 1 個主要版本)。
ALTER TABLE geoname ADD slug VARCHAR(20) GENERATED ALWAYS AS (slugify(name)), ADD INDEX slug_country_fclass (slug, country, fclass);
如果您希望繼續使用 5.6,並且您不經常更改 geoname 值,則可以將非規範化為:
ALTER TABLE geoname ADD slug VARCHAR(20) NOT NULL DEFAULT '', ADD INDEX slug_country_fclass (slug, country, fclass);
使用以下內容填充列:
UPDATE geoname SET slug=slugify(name);
完成上述步驟之一後,將查詢更改為使用 slug 生成的列:
SELECT name, latitude, longitude FROM geoname WHERE slug = 'lisboa' and geoname.country = 'PT' and geoname.fclass in ('A', 'T')
然後可以將新索引用於查詢的所有條件。