[英]Slow Query on Medium MySQL Table (1 Million Rows)
我有一个约有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秒。
请你帮助我好吗?
也许您可以优化属性长度。 有varchar(255)类型的5个属性。
无论如何,要想获得更快的速度,可以在insert / update语句上创建一个触发器,以将内容长度存储在另一个属性中。 因此,每次插入或更新一行时,触发器都会将长度存储在另一个整数类型的列中。
此外,您真的需要一次查询所有表吗?
您必须更改表的结构
like--senseid到integer writeForm的概念-应该使用此列来将索引添加到此bcozur来处理数据。
我已经重组了现有表并在架构中创建了更多表。 现在查询运行时间不到10毫秒。 新的dedict
表如下所示(我取消了writtenform
列,并更改了languageIdentifier
, partOfSpeech
和lexiconid
的类型):
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
此外,我还创建了四个表加盟: writtenForm
, languageIdentifier
, partOfSpeech
和lexiconid
。 这些表中的三个是真正的小( dedict_lang
有2条记录, dedict_partOfSpeech
有37条记录, dedict_lexicon
有4个记录),而dedict_writtenForm
只包含了id
,在writtenForm
本身的长度writtenForm
为100万条记录,但是索引正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.