对中型MySQL表(1百万行)的慢查询

时间:2014-12-08 19:52:18

标签: mysql sql query-optimization database-performance

我有一个大约有100万行的MySQL表。表名是dedict当我运行一个简单的查询时:

select writtenform from dedict where length(writtenform)>5 
    and partofspeech <> 'abbreviation' order by id asc limit 50,1

查询大约需要1秒钟。

我有id列(自动增量)和writtenForm上的索引作为主键。

下面是explain dedict的结果:

Field               Type                Null    Key     Default     Extra
senseid             varchar(255)        NO      NULL    
writtenForm         varchar(255)        YES     MUL     NULL
languageIdentifier  varchar(255)        YES     NULL        
partOfSpeech        varchar(255)        YES     NULL
_index              int(11)             YES     NULL
writtenText         longtext            YES     NULL
lexiconid           varchar(255)        YES     NULL
id                  int(11)             NO      PRI     NULL        auto_increment

一定有问题。我必须运行此查询5次才能显示网页,因此加载时间超过5秒。

你能帮我吗?

3 个答案:

答案 0 :(得分:2)

也许您可以优化属性长度。 varchar(255)类型有5个属性。

在任何情况下,为了获得更快的速度,您可以在insert / update语句上创建一个触发器,以将内容长度存储在另一个属性中。 因此,每次插入或更新行时,触发器都会将长度存储在另一个整数类型的列中。

此外,你真的需要一次查询所有表格吗?

答案 1 :(得分:0)

您必须更改表的结构

喜欢 - senseid到整数 writeForm ---应该使用此列操作数据来添加索引到此bcoz u r。

答案 2 :(得分:0)

我重新构建了现有表,并在架构中创建了更多表。现在查询运行时间不到10毫秒。 新的dedict表看起来像这样(我已经删除了writtenform列并更改了languageIdentifierpartOfSpeechlexiconid的类型:

Field               Type                Null    Key     Default     Extra
senseid             varchar(255)        NO      NULL    
languageIdentifier  tinyint             YES     NULL        
partOfSpeech        tinyint             YES     NULL
_index              int(11)             YES     NULL
writtenText         longtext            YES     NULL
lexiconid           tinyint             YES     NULL
id                  int(11)             NO      PRI     NULL        auto_increment

此外,我创建了四个加入表:writtenFormlanguageIdentifierpartOfSpeechlexiconid。这些表中有三个非常少(dedict_lang有2条记录,dedict_partOfSpeech有37条记录而dedict_lexicon有4条记录),而dedict_writtenForm只包含{{1} } {},id本身和writtenForm的长度是100万条记录,但正确编入索引。