首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL5.7上的多重自连接--性能差

MySQL5.7上的多重自连接--性能差
EN

Database Administration用户
提问于 2016-12-08 14:31:37
回答 1查看 149关注 0票数 0

我有一个包含大量地理名称的表,为了获得交叉引用的信息,我正在使用self查询它。

唯一的问题是,执行查询需要7/10秒(并锁定表),这表示应用程序的瓶颈。

我检查了其他的答案,但我无法为我找到解决办法。我想我创造了所有能帮助我的索引。我不是一个MySql的专家,所以如果你需要更多的信息,以更好的理解,请随便问。

这是一个查询:

代码语言:javascript
复制
select  gp.*,
                        gp1.description as desc_adm1,
                        gp2.description as desc_adm2,
                        gp3.description as desc_adm3,
                        gp4.description as desc_adm4
                 from
                 geonames_table gp left join
                 geonames_table gp1 on gp1.country = gp.country
                                        and gp1.geonames_code = 'ADM1'
                                        and gp1.adm1 = gp.adm1
                                        left join
                 geonames_table gp2 on gp2.country = gp.country
                                        and gp2.geonames_code = 'ADM2'
                                        and gp2.adm2 = gp.adm2
                                        left join
                 geonames_table gp3 on gp3.country = gp.country
                                        and gp3.geonames_code = 'ADM3'
                                        and gp3.adm3 = gp.adm3
                                        left join
                 geonames_table gp4 on gp4.country = gp.country
                                        and gp4.geonames_code = 'ADM4'
                                        and gp4.adm4 = gp.adm4
                 where 1  and LOWER(gp.description) like 'lo%'  limit 10;

它是针对这个表格结构启动的:

代码语言:javascript
复制
id  bigint(20)  NO  PRI     
description varchar(200)    NO  MUL     
alternative_names   varchar(5001)   NO          
country varchar(2)  NO  MUL     
adm1    varchar(20) NO  MUL     
adm2    varchar(80) NO  MUL     
adm3    varchar(20) YES MUL     
adm4    varchar(20) YES MUL     
latitudine  decimal(65,7)   NO          
longitudine decimal(65,7)   NO          
geonames_class  varchar(1)  NO          
geonames_code   varchar(10) NO  MUL 

谢谢你提前提供帮助。

在这里,显示创建表输出:

代码语言:javascript
复制
CREATE TABLE `31_geonames_places` (
   `id` bigint(20) NOT NULL,
   `description` varchar(200) NOT NULL,
   `alternative_names` varchar(5001) NOT NULL,
   `country` varchar(2) NOT NULL,
   `adm1` varchar(20) NOT NULL,
   `adm2` varchar(80) NOT NULL,
   `adm3` varchar(20) DEFAULT NULL,
   `adm4` varchar(20) DEFAULT NULL,
   `latitudine` decimal(65,7) NOT NULL,
   `longitudine` decimal(65,7) NOT NULL,
   `geonames_class` varchar(1) NOT NULL,
   `geonames_code` varchar(10) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `idx_nome_place` (`description`),
   KEY `Sigla_paese_place` (`country`),
   KEY `idx_geonames_code` (`geonames_code`),
   KEY `idx_adm1` (`adm1`),
   KEY `idx_adm2` (`adm2`),
   KEY `idx_adm3` (`adm3`),
   KEY `idx_adm4` (`adm4`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
EN

回答 1

Database Administration用户

发布于 2016-12-09 01:34:53

您需要4个复合索引,如

代码语言:javascript
复制
INDEX(country, geonames_code, adm2)

(列可以按任何顺序排列。)

请提供SHOW CREATE TABLE;下面我的两个评论将由它澄清。

LOWER(gp.description) like 'lo%'需要description的排序成为..._ci。如果是的话,这样做会好得多:

代码语言:javascript
复制
`gp.description like 'lo%'`

也就是说,“不区分大小写”的排序规则消除了对LOWER()的需求。

如果没有以description开头的索引,请添加这样的索引。

对于lat/液化天然气来说,decimal(65,7)太大了--它需要33个字节!讨论了更小的替代方案。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/157578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档