我有一个大约有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秒。
你能帮我吗?
答案 0 :(得分:2)
也许您可以优化属性长度。 varchar(255)类型有5个属性。
在任何情况下,为了获得更快的速度,您可以在insert / update语句上创建一个触发器,以将内容长度存储在另一个属性中。 因此,每次插入或更新行时,触发器都会将长度存储在另一个整数类型的列中。
此外,你真的需要一次查询所有表格吗?
答案 1 :(得分:0)
您必须更改表的结构
喜欢 - senseid到整数 writeForm ---应该使用此列操作数据来添加索引到此bcoz u r。
答案 2 :(得分:0)
我重新构建了现有表,并在架构中创建了更多表。现在查询运行时间不到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
只包含{{1} } {},id
本身和writtenForm
的长度是100万条记录,但正确编入索引。