优化简单的MySQL查询

时间:2014-05-21 22:19:56

标签: mysql

我有下表:

idTelephone int(11)
name varchar(255)
nameUrl varchar(255)
address text
city varchar(255)
cityUrl varchar(255)
cellphone int(1)

使用以下索引:

PRIMARY idTelephone
nameUrl BTREE
cityUrl BTREE
cityUrlNameUrl  BTREE   cityUrl, nameUrl
search  FULLTEXT name, nameUrl, address, city
name    FULLTEXT

我网站上有一个页面,我必须用分页显示所有电话号码。 所以我使用以下查询(对于页面26994):

SELECT * FROM dir_Telephone WHERE 1=1 ORDER BY nameUrl LIMIT 269930, 10

但它真的很慢......你怎么能优化像这样的简单查询呢?

EXPLAIN的输出是:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  dir_Telephone   ALL     NULL            NULL       NULL     NULL   269965   Using filesort

没有WHERE语句,结果是:

EXPLAIN (SELECT * FROM dir_Telephone ORDER BY nameUrl LIMIT 269930 , 10);

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  dir_Telephone   ALL        NULL         NULL    NULL        NULL   269965   Using filesort

CREATE STATEMENT是:

CREATE TABLE IF NOT EXISTS `dir_Telephone` (
  `idTelephone` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `nameUrl` varchar(255) DEFAULT NULL,
  `address` text,
  `city` varchar(255) DEFAULT NULL,
  `cityUrl` varchar(255) DEFAULT NULL,
  `cellphone` int(1) unsigned DEFAULT NULL,
  `htmlPublic` text,
  `htmlComplete` text,
  PRIMARY KEY (`idTelephone`),
  KEY `nameUrl` (`nameUrl`),
  KEY `cityUrl` (`cityUrl`),
  KEY `cityUrlNameUrl` (`cityUrl`,`nameUrl`),
  FULLTEXT KEY `search` (`name`,`nameUrl`,`address`,`city`),
  FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:3)

您要做的是向表中添加rownumber列。一种方法是定义一个新表,就像旧表一样,但是有一个自动递增的列。然后将数据加载到其中。或者,您可以执行以下操作。

alter table dir_Telephone add rownum integer;

update dir_telephone cross join
       (select @rn := 0) var
    set rownum = (@rn := @rn + 1)
    order by nameUrl;

create index dir_Telephone_rownum on dir_Telephone(rownum);

然后,在运行查询时,请勿在{{1​​}}子句中使用偏移量。使用limit子句:

where