一. 分页优化
1. 问题:在使用limit做分页的时候,如果是特别多的数据,性能会大大受到影响使用 limit offset, N 获取分页数据、 当offset非常大时,效率极低
原因是mysql并不是跳过offset行,然后单取N行
而是取offset+N行,然后丢弃前offset行,返回N行当offset越大,效率较低比如(100000000,10)加上没有索引他会全表查找……
2.解决方案
从业务上实现,直接不让用户查询70页后面的数据(百度,Google就是这么做的)
不使用 offset ,而是使用 where + limit 来实现,因为索引对排序是有帮助的select id,name from tableName where id>5000000 limit 10;
select id,name from tableName limit 5000000,10;
问题: 2次的结果不一致
原因: 数据被删除过(索引被破坏了找到的数据你说能一样吗)
解决: 数据不进行物理删除(可以逻辑删除)
非要物理删除,还要用offset精确查询,还不限制用户分怎么办?
实现思路:使用索引来实现,索引可速查找,先获取ID,然后再使用ID去查询数据,也叫做
延时关联
select id,name from tableName inner join (select id from tableName limit 5000000,10) as tmp using(id);{
using()这是代表a.cat_id=b.cat_id
}
二. 左前缀的难题
列如url
http://xxxx.com
http://xxxx.cn
http://xxxx.top
对于这样的列,前面的字符不易区分,如何解决?
解决方案一
把 url列反转 之后在存储
例如:将 http://xxxx.top 反转成 pot.www//:ptth 后存储,然后建立索引
解决方案二
使用伪hash处理,增加一列 int(11) unsigned ,使用crc32(url)处理url后再插入到新增加的该列