Mysql

MySQL 5.6 - 查詢性能問題。尋找蛞蝓

  • November 14, 2018

我有一個案例,我不知道如何提高此查詢的性能。

這是對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')

然後可以將新索引用於查詢的所有條件。

引用自:https://dba.stackexchange.com/questions/222561