学习啦——学设计>网页设计>网站建设>网站服务器管理>

Mysql怎么做分页优化的方法_Mysql分页优化有什么方法

宇民分享

  自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,尤其是页码大的页面更是慢的不行。下面由学习啦小编为大家整理的Mysql分页优化的方法,希望大家喜欢!

  Mysql分页优化的方法

  1.普通分页

  数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start

  select * from user limit 1,20

  这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后计算,这样大大影响效率

  SELECT * from user limit 100001,20; //time 0.151sexplain SELECT * from user limit 100001,20;

  我们可以用explain分析下语句,没有用到任何索引,MySQL执行的行数是16W+,于是我们可以想用到索引去实现分页。

  2.使用主键索引来优化数据分页

  select * from user where id>(select id from user where id>=100000 limit 1) limit 20; //time 0.003s

  使用explain分析语句,MySQL这次扫描的行数是8W+,时间也大大缩短。

  explain select * from user where id>(select id from user where id>=100000 limit 1) limit 20;

  Mysql如何分页

  一、基本分页技巧

  通常情况下,为了实现高效分页,需要在查询中WHERE条件列和排序列应用组合索引。

  例如,建立索引(a,b,c)使得以下查询可以使用索引,提高查询效率:

  1、字段排序

  ORDER BY a ORDER BY a,bORDER BY a, b, c ORDER BY a DESC, b DESC, c DESC

  2、筛选和排序

  WHERE a = const ORDER BY b, c WHERE a = const AND b = const ORDER BY c WHERE a = const ORDER BY b, c WHERE a = const AND b > const ORDER BY b, c

  3、下面查询是无法使用以上索引的

  ORDER BY a ASC, b DESC, c DESC//排序方向不一致WHERE g = const ORDER BY b, c // 字段g不是索引一部分WHERE a = const ORDER BY c //没有使用字段b WHERE a = const ORDER BY a, d // 字段d不是索引的一部分

  二、解决大数据量翻页问题

  1、将LIMIT M,N的查询改为LIMIT N

  例如,使用LIMIT 10000,20,Mysql将需要读取前10000行,然后获取后面的20行 ,这是非常低效的,使用LIMIT N的方式,通过每页第一条或最后一条记录的id来做条件筛选,再配合降序和升序获得上/下一页的结果集 。

  2、限制用户翻页数量

  产品实际使用过程中用户很少关心搜索结果的第1万条数据。

  3、使用延迟关联

  通过使用覆盖索引来查询返回需要的主键,再根据返回的主键关联原表获得需要的行,这样可以减少Mysql扫描那些需要丢弃的行数。

  如何解决MySQL远程连接不上

  1.排除网络或防火墙问题

  先看是否能ping通远程服务器,ping 192.168.1.211,如果不可以就是网络问题。然后,检查端口是否被防火墙挡住了,telnet 192.168.1.211 3306,如果连接失败,配置防火墙。

  配置防火墙,开启3306端口

  vi /etc/sysconfig/iptables-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允许3306端口通过防火墙)/etc/init.d/iptables restart(重启防火墙使配置生效)

  2.检查MySQL配置

  如果开启了防火墙,telnet还是失败,通过netstat查看3306的端口状态:

  netstat -apn|grep 3306tcp6 0 0 127.0.0.1:3306 :::* LISTEN 13524/mysqld

  注意地方,这说明3306被绑定到了本地。检查一下my.cnf的配置,这里可以配置绑定ip地址。

  bind-address=addr

  不配置或者IP配置为0.0.0.0,表示监听所有客户端连接。

  ps:我开启3306端口,并且检查MySQL配置之后,telent仍然失败,但是在本机telnet是ok的,再三确认了配置没有问题。后来跟我们的ucloud账号管理员提了一下,才知道ucloud管理后台也需要开启3306端口,用云服务器的留意这个。

  3.检查用户访问权限

  MySQL建用户的时候会指定一个host,默认是127.0.0.1/localhost,那么这个用户就只能本机访问,其它机器用这个用户帐号访问会提示没有权限,host改为%,表示允许所有机器访问。