中等MySQL表查询速度慢(100万行)

中等MySQL表查询速度慢(100万行),mysql,sql,query-optimization,database-performance,Mysql,Sql,Query Optimization,Database Performance,我有一个MySQL表,大约有一百万行。当我运行以下简单查询时,表名为dedict: select writtenform from dedict where length(writtenform)>5 and partofspeech <> 'abbreviation' order by id asc limit 50,1 一定是出了什么事。我必须运行此查询5次才能显示网页,因此加载时间超过5秒 您能帮助我吗?也许您可以优化属性长度。varchar(255)类型有5

我有一个MySQL表,大约有一百万行。当我运行以下简单查询时,表名为
dedict

select writtenform from dedict where length(writtenform)>5 
    and partofspeech <> 'abbreviation' order by id asc limit 50,1
一定是出了什么事。我必须运行此查询5次才能显示网页,因此加载时间超过5秒


您能帮助我吗?

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

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


此外,您真的需要一次查询所有表吗

您必须更改表的结构

比如从senseid到integer
writtenForm---应该使用此列将索引添加到此bcoz u r以处理数据。

我已重新构造了现有表,并在架构中创建了更多表。现在查询运行不到10毫秒。 新的
dedict
表如下所示(我已取消了
writenform
列,并更改了
languageIdentifier
partOfSpeech
lexiconid
的类型):


此外,我还创建了四个用于联接的表:
writenform
languageIdentifier
partOfSpeech
lexiconid
。这些表中有三个非常小(
dedict_lang
有2条记录,
dedict_-partOfSpeech
有37条记录,
dedict_-lexicon
有4条记录),而
dedict_-writenform
只包含
id
writenform
本身和
writenform
的长度为100万条记录,但是索引正确。

您能更改表的结构吗?我不明白为什么人们选择关键字来命名表的列writtenfrom上的索引是usless的,除非它是基于长度的索引。那么,仅仅添加一个长度为writtenform的新列就足够了吗?然后我应该简单地索引这个新列,或者还有其他内容?MySQL不支持基于长度的索引,所以创建一个触发器和另一个属性作为索引就可以了。这个表是用于字典的。它包含一种语言中的大多数单词。我不打算更新它。所以,我应该添加一个新的writenform长度的列吗?有帮助吗?关于另一个问题,我想在所有页面上显示5个随机单词。这就是我查询它5次的原因。添加一个新列来存储长度会更快,因为您将一个整数与另一个整数(而不是两个字符串)进行比较。“length(writenform)>5”检索属性的大小,然后进行比较。“partofspeech‘缩写’”也是一个比较。您应该尽量不比较字符串以防止性能问题。如果在另一个表中传播“partOfSpeech”并仅在“dedict”表中保存id是有意义的,您应该这样做。因为如果你将“缩写”多次存储为关键字,它是多余的。但是这个选择取决于您的模式。@CatalinMarcu您的查询并不仅仅得到第50行。您将得到满足两个特征的第50行。DB在查找之前不知道语音的
部分是什么,在查找之前不知道
writenform
需要多长时间,也不知道在找到50之前需要查找多长时间。由于
LONGTEXT
是一种BLOB数据类型,因此使用函数进行查询效率非常低(在单个字段值中允许超过4GB的文本)。斑点不是为了这个。想象一下,在满足
4x^3+x^2可被7整除的无序序列中找到第50个有序数。我无法将senseid更改为整数,因为以后我会在senseid上加入其他表
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
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