Mysql大表问题处理
查询优化
为什么慢?
确定目标数据时,扫描行数太多
业务查询范围过大。
库本身数据量大
硬件
mysql配置
offset大
解决
确定目标数据时,扫描行数太多
无索引
- 常用
- 条件,排序,分组字段。
- 其他
- 唯一索引使用了普通索引
- 关联字段类型不同,一个是int,一个是varchar
业务查询范围过大。
时间范围大
名称模糊查询和时间范围在一块
前端门店模糊确定出门店编码,后端用branchCode精确查
数据量大,传输慢。
- 网络带宽
- 分批
库本身数据量大
- 分库分表
硬件
mysql配置
offset大
不用offset,改为id
延迟关联或者子查询优化
阿里巴巴编码规范-说明:MySQL并不是跳过offset行,而是取offset+N行,然后返回前放弃前面的offset行,返回N行,那当offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。
正例:先快谏定位需要获取的id段,然后再关联:1
SELECT t1.* FROM 表1as t1,(select id from 表1 where 条件 limit 100000, 20)as t2 where t1.id=t2.id
1
2
3
4
5
6
7
8
9
10
11
12<select id="list" parameterType="com.xxx.OrderPageQuery" resultType="com.xxx.OrderDO">
SELECT
<include refid="all_columns"/>
FROM t_order a
INNER JOIN (
SELECT id AS bid
FROM t_order
<include refid="listConditions"/>
ORDER BY id DESC
LIMIT #{offset},#{pageSize}
) b ON a.id = b.bid
</select>
参考
[[Mysql性能分析和优化]]