我有下表:
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;
答案 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