MYSql分页查询效率提高

MySql 码拜 9年前 (2016-02-11) 1892次浏览
CREATE TABLE `goods` (
  `UrlId` char(100) CHARACTER SET utf8 NOT NULL,
  `Title` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `CreateTime` char(30) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`UrlId`)
)

上面是本人表格的结构,本人的程序是用来做搜索引擎的,UrlId用来存储网址,title存标题,UrlId网址是主键唯一,
原因是是做搜索引擎的缘故,所以数据极其庞大,千万以上吧,之前分页看到都是用Limite,但是听说数据超大的时候回产生效率极其低下的情况,本人看到其他解决方案就是

SELECT * FROM goods WHERE id >= (SELECT id FROM table LIMIT 1000000, 1) LIMIT 10; 

都是有一个对那个自增的ID进行限制,可是本人的主键是UrlId 是字符串,不是普通的ID数字,所以这个有点乏力,希望大家能帮忙写出解决方案(原因是本人擅长前台,而且之前是sqlserver 的,所以代码不擅长,最好有具体的代码,谢谢了。)

解决方案

50

另外,把代码改为:
SELECT * FROM goods WHERE UrlId in (SELECT UrlId FROM table LIMIT 1000000, 10) ;

15

引用 8 楼 telwo 的回复:
Quote: 引用 4 楼 yupeigu 的回复:

另外,把代码改为:
SELECT * FROM goods WHERE UrlId in (SELECT UrlId FROM table LIMIT 1000000, 10) ;

另外本人还有一个排序的情况就是,本人为了让本人的网页显示每时每刻都在刷新,本人会按照时间排序,所以首页显示的分页情况,都是按时间最近插入的数据,就是还会order  by  CreateTime  这样可以怎么样做呢

假如要按照createtime来排序,可以这样创建索引:
create index idx_googs_createtime on (createtime) 就可以了
至于代码,和上面的一样。
另外,你说的假如增加了自增id,还需要按照 url来进行查询,这个也是可以的,只要给urlid再创建一个索引就可以,那么就是这么创建:
create index idx_googs_createtime_urlid on (createtime,UrlId)

30

引用 10 楼 yupeigu 的回复:
Quote: 引用 8 楼 telwo 的回复:
Quote: 引用 4 楼 yupeigu 的回复:

另外,把代码改为:
SELECT * FROM goods WHERE UrlId in (SELECT UrlId FROM table LIMIT 1000000, 10) ;

另外本人还有一个排序的情况就是,本人为了让本人的网页显示每时每刻都在刷新,本人会按照时间排序,所以首页显示的分页情况,都是按时间最近插入的数据,就是还会order  by  CreateTime  这样可以怎么样做呢

假如要按照createtime来排序,可以这样创建索引:
create index idx_googs_createtime on (createtime) 就可以了
至于代码,和上面的一样。
另外,你说的假如增加了自增id,还需要按照 url来进行查询,这个也是可以的,只要给urlid再创建一个索引就可以,那么就是这么创建:
create index idx_googs_createtime_urlid on (createtime,UrlId)

对的,只是增加一列计数而已,对查询不影响。

5

還是建議用自增或本人生成的ID做主鍵。
主鍵相當於唯一索引,它是要占用額外的空間的,何況你這還是char(100)的大小。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MYSql分页查询效率提高
喜欢 (0)
[1034331897@qq.com]
分享 (0)