GVKun编程网logo

Mysql必读mysql高效分页的实例分析(mysql 高效分页)

23

本文将介绍Mysql必读mysql高效分页的实例分析的详细情况,特别是关于mysql高效分页的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Mysq

本文将介绍Mysql必读mysql高效分页的实例分析的详细情况,特别是关于mysql 高效分页的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Mysql入门Mysql高效分页详解、Mysql学习MySQL高效分页解决方案集分享、Mysql必读mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载、Mysql必读mysql DBA:mysqladmin常用命令总结的知识。

本文目录一览:

Mysql必读mysql高效分页的实例分析(mysql 高效分页)

Mysql必读mysql高效分页的实例分析(mysql 高效分页)

《MysqL必读MysqL高效分页的实例分析》要点:
本文介绍了MysqL必读MysqL高效分页的实例分析,希望对您有用。如果有疑问,可以联系我们。

导读:本节内容:MysqL高效分页首先,MysqL分页的基本原理: MysqL> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000,2...

MysqL数据库本节内容:
MysqL高效分页

MysqL数据库首先,MysqL分页的基本原理:
 

MysqL> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000,20G
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)

MysqL数据库代码说明:
limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣.文中还提到limit n性能是没问题的,因为只扫描n行.

MysqL数据库文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样 的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候sql语句可以是:
 

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;

MysqL数据库处理”下一页”的时候sql语句可以是:
 

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;
 

MysqL数据库不管翻多少页,每次查询只扫描20行.

MysqL数据库缺点是只能提供”上一页”、”下一页”的链接形式,有个二货喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?

MysqL数据库如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,
当前页条目id最大的是9527,比如要跳到第8页,sql语句可以这样:
 

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;

MysqL数据库跳转到第13页:
 

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;

小编PHP培训学院每天发布《MysqL必读MysqL高效分页的实例分析》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。

Mysql入门Mysql高效分页详解

Mysql入门Mysql高效分页详解

《MysqL入门MysqL高效分页详解》要点:
本文介绍了MysqL入门MysqL高效分页详解,希望对您有用。如果有疑问,可以联系我们。

MysqL入门前言

MysqL入门通常针对MysqL大数据量的查询采取“分页”策略,但是如果翻页到比较靠后的位置时查询将变得很慢,因为MysqL将花费大量的时间来扫描需要丢弃的数据.

MysqL入门基本分页技巧

MysqL入门通常情况下,为了实现高效分页,需要在查询中WHERE条件列和排序列应用组合索引.
例如,建立索引(a,b,c)使得以下查询可以使用索引,提高查询效率:

MysqL入门1、字段排序

MysqL入门
ORDER BY a 
ORDER BY a,b
ORDER BY a,c 
ORDER BY a DESC,b DESC,c DESC 

MysqL入门2、筛选和排序

MysqL入门
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 

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

MysqL入门
ORDER BY a ASC,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不是索引的一部分 

MysqL入门解决大数据量翻页问题

MysqL入门1、将LIMIT M,N的查询改为LIMIT N
例如,使用LIMIT 10000,20,MysqL将需要读取前10000行,然后获取后面的20行,这是非常低效的,使用LIMIT N的方式,通过每页第一条或最后一条记录的id来做条件筛选,再配合降序和升序获得上/下一页的结果集 .
2、限制用户翻页数量
产品实际使用过程中用户很少关心搜索结果的第1万条数据.
3、使用延迟关联
通过使用覆盖索引来查询返回需要的主键,再根据返回的主键关联原表获得需要的行,这样可以减少MysqL扫描那些需要丢弃的行数.

MysqL入门实例:
使用索引(sex,rating)进行查询:

MysqL入门
MysqL> SELECT <cols> FROM profiles INNER JOIN (
-> SELECT <primary key cols> FROM profiles
-> WHERE x.sex='M' ORDER BY rating LIMIT 100000,10
-> ) AS x USING(<primary key cols>);

MysqL入门以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编PHP.

Mysql学习MySQL高效分页解决方案集分享

Mysql学习MySQL高效分页解决方案集分享

《MysqL学习MysqL高效分页解决方案集分享》要点:
本文介绍了MysqL学习MysqL高效分页解决方案集分享,希望对您有用。如果有疑问,可以联系我们。

一,最常见MysqL最基本的分页方式:
代码如下:

select * from content order by id desc limit 0,10

在中小数据量的情况下,这样的sql足够用了,唯一需要注意的问题就是确保使用了索引.随着数据量的增加,页数会越来越多,查看后几页的sql就可能类似:
代码如下:

select * from content order by id desc limit 10000,10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢.
此时,我们可以通过2种方式:
一,子查询的分页方式来提高分页效率,飘易用的sql语句如下:
代码如下:

SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.",1) ORDER BY id desc LIMIT $pagesize

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率.(via)通过explain sql语句发现:子查询使用了索引!
代码如下:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where
2 SUBQUERY content index NULL PRIMARY 4 NULL 27085 Using index

经过飘易的实测,使用子查询的分页方式的效率比纯LIMIT提高了14-20倍!
二,JOIN分页方式
代码如下:

select * FROM `content` AS t1
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.",1) AS t2
WHERE t1.id

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致.explain sql语句:
代码如下:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY system NULL NULL NULL NULL 1
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

三,使用MysqL的FOUND_ROWS()函数
MysqL FOUND_ROWS() 函数结合sql_CALC_FOUND_ROWS在SELECT中可以得到两个结果:
1. 得到Limit的内容
2. 得到去除Limit以后所有行数
SELECT语句中经常可能用LIMIT限制返回行数.有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含sql_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:
代码如下:

select sql_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

其中sql_CALC_FOUND_ROWS 告诉MysqL将sql所处理的行数记录下来,FOUND_ROWS() 则取到了这个纪录. 虽然也是两个语句,但是只执行了一次主查询,所以效率比原来要高很多.
1. 如果在前一条语句中使用sql_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回第一条语句没有LIMIT时返回的行数.
2. 如果在前一条语句中没有使用sql_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数.
如果使用 SELECT sql_CALC_FOUND_ROWS,MysqL必须计算所有结果集的行数.尽管这样,总比再执行一次不使用LIMIT的查询要快多了吧,因为那样结果集要返回客户端滴.(另外:应该不单是没有将结果集返回的原因,还有原因可能是比如LIKE之类比较费劲的sql不需要再去劳累一次.)
代码如下:

-- 注意下面语句中的条件 LIKE
SELECT sql_CALC_FOUND_ROWS * FROM tbl_name WHERE Name LIKE '%string%' id > 100 LIMIT 10;
SELECT FOUND_ROWS();

代码如下:

-- 上面语句等价于下面语句,但性能方面应该提升非常非常的明显:
SELECT COUNT(*) FROM tbl_name WHERE Name LIKE '%string%' ;
SELECT * FROM tbl_name WHERE Name LIKE '%string%' id > 100 LIMIT 10;

Mysql必读mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载

Mysql必读mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载

《MysqL必读MysqL 5.0.67最新版替代MysqL 5.0.51b版本官方下载》要点:
本文介绍了MysqL必读MysqL 5.0.67最新版替代MysqL 5.0.51b版本官方下载,希望对您有用。如果有疑问,可以联系我们。

 功能新增或变更的: 
安全增强:使严格控制的位置,从哪个用户定义的函数可以被载入, plugin_dir系统变量已的
backported从MysqL 5.1 .如果该值非空,用户定义函数对象的文件可以被加载,只有从目录中命名这个
变量.如果该值是空的,行为是用来前5.0.67适用于: UDF的对象文件必须设在一个目录是搜查你的系统
的动态链接. (错误# 37428 ) 
重要的变化:不兼容的变化: FEDERATED存储引擎是现在默认情况下禁用在. cnf文件发运与MysqL分布
(我- huge.cnf ,我- medium.cnf ,等等) .这会影响服务器的行为,只有如果您安装了其中的一个
文件. (错误# 37069 ) 
群集的空气污染指数:重要的变化:由于ndb_le_memoryusage.page_size_kb显示记忆体页的大小字节,
而不是千字节,它已更名为page_size_bytes .名称page_size_kb现在已废弃,因此须移走在将来的版本
,虽然它目前仍然是支持为理由,向后兼容.看到ndb_logevent_type类型,如需有关
ndb_le_memoryusage . (错误# 30271 ) 
重要的变化:一些变化,作出检查表...为升级和修复表方面的检测和处理表与不相容的. frm档案(副
档创造了一个不同的MysqL服务器的版本) .这些变化也影响到MysqLcheck ,因为程序使用检查表和修
复表,从而也MysqL_upgrade ,因为该程序调用MysqLcheck . 
如果您的表已建立由不同的MysqL服务器的版本比1 ,你正在运行,检查表...为提升表明,该表中有一. 
frm文件不兼容的版本.在这种情况下,结果集传回的检查表包含一个符合一msg_type价值的错误和
msg_text价值表需要升级.请勿“修复表tbl_name ` ` ” ,以修复它! 
修复表没有use_frm升级. frm文件到当前版本. 
如果您使用维修表... use_frm和你的表是创造了不同版本的MysqL服务器比一,维修表,将
不会试图修复表.在这种情况下,结果集经由修复表包含一个符合一msg_type价值的错误和msg_text的价
值未能修复不相容的. frm文件. 
以前,使用维修表... use_frm一个表所造成的不同版本的MysqL服务器的危险,损失所有列在表中.
http://dev.MysqL.com/doc/refman/5.0/en/releasenotes-cs-5-0-67.html
http://MysqL.skynet.be/Downloads/MysqL-5.0/MysqL-5.0.67-win32.zip
http://MysqL.skynet.be/Downloads/MysqL-5.0/MysqL-essential-5.0.67-win32.msi
http://MysqL.skynet.be/Downloads/MysqL-5.0/MysqL-noinstall-5.0.67-win32.zip
下载导航
http://dev.MysqL.com/downloads/MysqL/5.0.html

Mysql必读mysql DBA:mysqladmin常用命令总结

Mysql必读mysql DBA:mysqladmin常用命令总结

《MysqL必读MysqL DBA:MysqLadmin常用命令总结》要点:
本文介绍了MysqL必读MysqL DBA:MysqLadmin常用命令总结,希望对您有用。如果有疑问,可以联系我们。

1. 使用-r/-i参数
使用MysqLadmin extended-status命令可以获得所有MysqL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果想了解当前的状态,则需要进行一次差值计算,这就是MysqLadmin extended-status的一个额外功能,非常实用.默认的,使用extended-status,看到也是累计值,但是,加上参数-r(--relative),就可以看到各个指标的差值,配合参数-i(--sleep)就可以指定刷新的频率,那么就有如下命令:
MysqL必读

代码如下:
MysqLadmin -uroot -r -i 1 -pxxx extended-status
+------------------------------------------+----------------------+
| Variable_name                            | Value                |
+------------------------------------------+----------------------+
| Aborted_clients                          | 0                    |
| Com_select                               | 336                  |
| Com_insert                               | 243                  |
......
| Threads_created                          | 0                    |
+------------------------------------------+----------------------+
2. 配合grep使用
配合grep使用,我们就有:
代码如下:
MysqLadmin -uroot -r -i 1 -pxxx extended-status \
|grep "Questions\|Queries\|Innodb_rows\|Com_select \|Com_insert \|Com_update \|Com_delete "
| Com_delete                               | 1                    |
| Com_delete_multi                         | 0                    |
| Com_insert                               | 321                  |
| Com_select                               | 286                  |
| Com_update                               | 63                   |
| Innodb_rows_deleted                      | 1                    |
| Innodb_rows_inserted                     | 207                  |
| Innodb_rows_read                         | 5211                 |
| Innodb_rows_updated                      | 65                   |
| Queries                                  | 2721                 |
| Questions                                | 2721                 |
3. 配合简单的awk使用
使用awk,同时输出时间信息:
代码如下:
MysqLadmin -uroot -p -h127.0.0.1 -P3306 -r -i 1 ext |\
awk -F"|" '{\
  if($2 ~ /Variable_name/){\
    print " <-------------    "  strftime("%H:%M:%s") "    ------------->";\
  }\
  if($2 ~ /Questions|Queries|Innodb_rows|Com_select |Com_insert |Com_update |Com_delete |Innodb_buffer_pool_read_requests/)\
    print $2 $3;\
}'
<-------------    12:38:49    ------------->
 Com_delete                             0
 Com_insert                             0
 Com_select                             0
 Com_update                             0
 Innodb_buffer_pool_read_requests       589
 Innodb_rows_deleted                    0
 Innodb_rows_inserted                   2
 Innodb_rows_read                       50
 Innodb_rows_updated                    50
 Queries                                105
 Questions                              1
 <-------------    12:38:50    ------------->
 Com_delete                             0
 Com_insert                             0
 Com_select                             0
 Com_update                             0
 Innodb_buffer_pool_read_requests       1814
 Innodb_rows_deleted                    0
 Innodb_rows_inserted                   0
 Innodb_rows_read                       8
 Innodb_rows_updated                    8
 Queries                                17
 Questions                              1
 4. 配合复杂一点的awk
反正也不简单了,那就更复杂一点,这样让输出结果更友好点,因为awk不支持动态变量,所以代码看起来比较复杂:
代码如下:
MysqLadmin -P3306 -uroot -p -h127.0.0.1 -r -i 1 ext |\
awk -F"|" \
"BEGIN{ count=0; }"\
'{ if($2 ~ /Variable_name/ && ++count == 1){\
    print "----------|---------|--- MysqL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --";\
    print "---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical";\
}\
else if ($2 ~ /Queries/){queries=$3;}\
else if ($2 ~ /Com_select /){com_select=$3;}\
else if ($2 ~ /Com_insert /){com_insert=$3;}\
else if ($2 ~ /Com_update /){com_update=$3;}\
else if ($2 ~ /Com_delete /){com_delete=$3;}\
else if ($2 ~ /Innodb_rows_read/){innodb_rows_read=$3;}\
else if ($2 ~ /Innodb_rows_deleted/){innodb_rows_deleted=$3;}\
else if ($2 ~ /Innodb_rows_inserted/){innodb_rows_inserted=$3;}\
else if ($2 ~ /Innodb_rows_updated/){innodb_rows_updated=$3;}\
else if ($2 ~ /Innodb_buffer_pool_read_requests/){innodb_lor=$3;}\
else if ($2 ~ /Innodb_buffer_pool_reads/){innodb_phr=$3;}\
else if ($2 ~ /Uptime / && count >= 2){\
  printf(" %s |%9d",strftime("%H:%M:%s"),queries);\
  printf("|%6d %6d %6d %6d",com_select,com_insert,com_update,com_delete);\
  printf("|%6d %8d %7d %7d",innodb_rows_read,innodb_rows_inserted,innodb_rows_updated,innodb_rows_deleted);\
  printf("|%10d %11d\n",innodb_lor,innodb_phr);\
}}'
代码如下:
----------|---------|--- MysqL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --
---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical
 10:37:13 |     2231|   274    214     70      0|  4811      160      71       0|      4146           0
 10:37:14 |     2972|   403    256     84     23|  2509      173      85      23|      4545           0
 10:37:15 |     2334|   282    232     66      1|  1266      154      67       1|      3543           0
 10:37:15 |     2241|   271    217     66      0|  1160      129      66       0|      2935           0
 10:37:17 |     2497|   299    224     97      0|  1141      149      95       0|      3831           0
 10:37:18 |     2871|   352    304     74     23|  8202      226      73      23|      6167           0
 10:37:19 |     2441|   284    233     82      0|  1099      121      78       0|      3292           0
 10:37:20 |     2342|   279    242     61      0|  1083      224      61       0|      3366       

就这样了,这几个命令本身用的比较多,随手分享出来.MysqL必读

小编PHP培训学院每天发布《MysqL必读MysqL DBA:MysqLadmin常用命令总结》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。

我们今天的关于Mysql必读mysql高效分页的实例分析mysql 高效分页的分享就到这里,谢谢您的阅读,如果想了解更多关于Mysql入门Mysql高效分页详解、Mysql学习MySQL高效分页解决方案集分享、Mysql必读mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载、Mysql必读mysql DBA:mysqladmin常用命令总结的相关信息,可以在本站进行搜索。

本文标签: