[英]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.