MYSQL分页limit速度太慢优化方法

2017-12-08  本文已影响1112人  tianmac

MySQL 百万级分页优化(Mysql千万级快速分页)(转)

MYSQL分页limit速度太慢优化方法

MYSQL分页limit速度太慢的优化方法

如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)

MySQL 百万级分页优化(Mysql千万级快速分页)

MySQL大数据量分页性能优化

mysql 正则表达式查询含有非数字和字符的记录

MYSQL分页limit速度太慢优化方法

问题原因

limit10000,20 的意思扫描满足条件的 10020 行,扔掉前面的 10000 行,返回最后的 20 行,问题就在这里

原理

利用表的覆盖索引来加速分页查询
我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何:

这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:
select id from product limit 866613, 20 0.2秒

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20 查询时间为0.2秒,简直是一个质的飞跃啊,哈哈

另一种写法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id 查询时间也很短,赞!

优化方案

正则【mysql 中正则表达式使用 regexp 关键字】

eg1: 从info表name字段中查询以L开头的记录 

select * from info where name regexp '^L'; 

eg2: 从info表name字段中查询以aaa开头的记录 

select * from info where name regexp '^aaa'; 
eg1: 从info表name字段中查询以c结尾的记录 

select * from info where name regexp 'c$'; 

eg2: 从info表name字段中查询以aaa结尾的记录 

select * from info where name regexp 'aaa$'; 
eg1: 从info表name字段中查询以L开头y结尾中间有两个任意字符的记录 

select * from info where name regexp '^L..y$'; 
eg1: 从info表name字段中查询包含c、e、o三个字母中任意一个的记录 

select * from info where name regexp '[ceo]'; 

eg2: 从info表name字段中查询包含数字的记录 

select * from info where name regexp '[0-9]'; 

eg3: 从info表name字段中查询包含数字或a、b、c三个字母中任意一个的记录 

select * from info where name regexp '[0-9a-c]'; 
eg1: 从info表name字段中查询包含a-w字母和数字以外字符的记录 

select * from info where name regexp '[^a-w0-9]'; 
eg1: 从info表name字段中查询包含'ic'的记录 

select * from info where name regexp 'ic'; 

eg2: 从info表name字段中查询包含ic、uc、ab三个字符串中任意一个的记录 

select * from info where name regexp 'ic|uc|ab'; 
eg1: 从info表name字段中查询c之前出现过a的记录 

select * from info where name regexp 'a*c'; 
eg1: 从info表name字段中查询c之前出现过a的记录 

select * from info where name regexp 'a+c';(注意比较结果!) 
eg1: 从info表name字段中查询出现过a3次的记录 

select * from info where name regexp 'a{3}'; 
eg1: 从info表name字段中查询ab出现最少1次最多3次的记录 

select * from info where name regexp 'ab{1,3}'; 
`SELECT * FROM a1 WHERE name LIKE binary` `'%J%'`  `#使用LIKE+通配符匹配大写J`

`SELECT * FROM a1 WHERE name regexp binary` `'j'`  `#使用正则匹配小写j`
上一篇下一篇

猜你喜欢

热点阅读