Mysql 优化之延迟索引和分页优化

什么是延迟索引?使用索引查询出来数据,之后把查询结果和同一张表中数据进行连接查询,进而提高查询速度!

分页是一个很常见功能,select   **  from tableName limit  ($page -  1 )  * $n ,$n

通过一个存储过程进行测试:

create table smth1 (
	id int auto_increment ,
	ver int(11) default null,
	content varchar(1000) not null,
	intro varchar(1000) not null,
	primary key(id),
	key idver(id,ver)

)engine = innodb default charset = utf8;
create procedure smthTest1()
begin
	declare num int default 100001;
	while num < 1000000 do
		set num := num +1;
		insert into smth1 values (num ,num,'我是步迎飞','我是谁');
	end while ;

end;

查询:

mysql> show profiles;
+----------+------------+----------------------------------------------+
| Query_ID | Duration   | Query                                        |
+----------+------------+----------------------------------------------+
|        1 |   0.002006 | select id ,content from smth1 limit 1000,10  |
|        2 |   0.030106 | select id ,content from smth1 limit 5000,10  |
|        3 |   0.042428 | select id ,content from smth1 limit 9000,10  |
|        4 | 0.01297225 | select id ,content from smth1 limit 10000,10 |
|        5 | 0.13077625 | select id ,content from smth1 limit 20000,10 |

可见随着查询$page 变大,时间会越来越大!

怎样避免这种情况?

一般我们数据库里面数据都不会直接删除,数据时很宝贵的,不舍得删除,另一方便能提高查询数据

先利用索引查询出来数据,再进行联合查询不就行了

 select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 1000 limit 10
) as t on C.id = t.id ;

select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 5000 limit 10
) as t on C.id = t.id ;

select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 9000 limit 10
) as t on C.id = t.id ;

select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 10000 limit 10
) as t on C.id = t.id ;

select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 20000 limit 10
) as t on C.id = t.id ;

进行效率分析,没有一个大于1s的

11 | 0.04538625 | select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 5000 limit 10
) as t on C.id = t.id  |
|       12 |   0.023278 | select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 9000 limit 10
) as t on C.id = t.id  |
|       13 | 0.02320425 | select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 10000 limit 10
) as t on C.id = t.id |
|       14 |   0.001938 | select C.id,C.content from smth1 C inner join
(
	select id from smth1 where id > 20000 limit 10
) as t on C.id = t.id |
时间: 2024-12-10 17:09:10

Mysql 优化之延迟索引和分页优化的相关文章

Oracle与Mysql主键、索引及分页的区别小结

Oracle与Mysql主键.索引及分页的区别,学习oracle的朋友可以参考下 区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id.nextval 2.索引: mysql索引从0开始,Oracle从1开始. 3.分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据. Oracle:select * from user sele

MySQL 百万级、千万级 分页优化

查询字段一较长字符串的时候,表设计时要为该字段多加一个字段,如,存储网址的字段 查询的时候,不要直接查询字符串,效率低下,应该查诡该字串的crc32或md5 如何优化Mysql千万级快速分页 Limit 1,111 数据大了确实有些性能上的问题,而通过各种方法给用上where id >= XX,这样用上索引的id号可能速度上快点儿.By:jack Mysql limit分页慢的解决办法(Mysql limit 优化,百万至千万条记录实现快速分页) MySql 性能到底能有多高?用了php半年多,

Mysql数据库百万级记录查询分页优化

很多的朋友在面试中会遇到这样的问题,也有很多的项目在运营一段时间后也会遇到MYSQL查询中变慢的一些瓶颈,今天这儿简单的介绍下我常用的几种查询分页的方法,我所知道的也无非就是索引.分表.子查询偏移,所以要是有什么不对或有更好的方法,欢迎大家留言讨论. 效率分析关键词:explain + SQL语句 一,最常见MYSQL最基本的分页方式limit: select * from `table` order by id desc limit 0, 20 在中小数据量的情况下,这样的SQL足够用了,唯一

MySQL存储引擎,索引及基本优化策略

存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有所不同,我们根据需要进行选择,比如包含ETL操作的OLTP(联机交易处理)项目中我们通常选择InnoDB,而对于读操作较多几乎没有写操作的OLAP(联机分析处理)则选MyISAM的更多.因此并不是大家都用环境相似,同一版本的MySQL,能够使用的特性就是一致的.在MySQL终端中查看支持的存储引擎,

MySQL出现同步延迟如何解决?优化?

工作中常常遇到的问题,叫我很是头疼,稍稍整理了个方案. 1.主从复制的从库太多导致复制延迟 优化:建议从库数量3-5个为宜(具体看自己硬件配置)   2.从库硬件比主库硬件差 优化:提升硬件性能   3.慢SQL语句过多 优化:SQL语句执行时间太长,需要优化SQL语句(需要联系DBA开发共同商讨优化语句)   4.主从复制的设计问题 优化:主从复制单线程,可以通过多线程IO方案解决:另外MySQL5.6.3支持多线程IO复制.   5.主从库之间的网络延迟 优化:尽量链路短,提升端口带宽  

MySQL的LIMIT与分页优化

在系统中需要进行分页操作的时候,我们通常会使用LIMIT加上偏移量的办法实现,同时加上合适的ORDER BY子句.如果有对应的索引,通常效率会不错,否则,MySQL需要做大量的文件排序操作. 一个非常常见又令人头疼的问题就是,在偏移量非常大的时候,例如可能是LIMIT 10000,20这样的查询,这时MySQL需要查询10020条记录后只返回最后20条,前面10000条记录都将被抛弃,这样的代价非常高.如果所有的页面被访问的频率都相同,那么这样的查询平均需要访问半个表的数据.要优化这种查询,要么

MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案,因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的场景的,同时,面对能够达到优化的方式要追究其原因,同样的做法,换了个场景,达不到优化效果的,还要追究其原因.个人对此场景在不用情况表示怀疑,然后自己测试了一把,果然发现一些问题,同时也证实了一些预期的想法.

MySQL单表百万数据记录分页性能优化

原文地址:http://www.cnblogs.com/lyroge/p/3837886.html MySQL单表百万数据记录分页性能优化 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schemaSELECT * FROM TABLES WHERE TABLE_SCHEMA = 'dbna

(转)Mysql 索引原理及优化

本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 二.常见的查询算法及数据结构 为什么这里要讲查询算