mysql 联表查询 100w+数据优化

产生原因

闲来无事,使用vue封装了个table组件,封装完成后想测试下,数据量小的情况下,能迅速展现数据,数据上了100w后,直接超时,结果一步步排查,发现是sql查询的问题

场景回顾

使用表:订单表 order (100w+),商品表goods  , 用户表 user 

 



未优化前sql查询语句:

SELECT o.order_id, u.username,g.title,g. STATUS,g.id AS gid,g.price,o.goods_num,(g.price * o.goods_num) AS totalPrice,o.w_time,u.phone,u.id AS uids,u.role,o.id FROM self_order o inner JOIN `self_user` `u` ON `u`.`uid` = `o`.`uid` inner JOIN `self_goods` `g` ON `g`.`id` = `o`.`goods_id` ORDER BY `o`.`order_id` DESC, `o`.`w_time` DESC LIMIT 0, 15;

效果如下:

<think>我们正在讨论的是MySQL包含60万条数据优化方法。根据引用[^1]和引用[^2],我们可以从多个方面进行优化:索引优化查询语句优化结构优化、缓存策略等。下面将详细展开。 </think>### MySQL 60万条数据优化方法 以下是针对**60万条数据**的MySQL优化策略(基于引用[^1][^2]的百万优化原则调整),按优先级排序: --- #### 一、索引优化(核心手段) 1. **复合索引覆盖高频查询** ```sql -- 示例:对WHERE条件中的字段创建复合索引 CREATE INDEX idx_optim ON your_table (htmlname, logurl, dt); ``` - **规则**:将`WHERE`和`JOIN`中的高频字段组合索引,字段顺序按**区分度降序排列**(如`dt`日期字段放最后) - **验证效果**:使用`EXPLAIN`检查索引命中情况,确保`Extra`列出现`Using index`[^1] 2. **避免索引失效场景** - ❌ 禁止对索引列计算:`WHERE YEAR(dt)=2023` → ✅ 改为范围查询:`WHERE dt BETWEEN '2023-01-01' AND '2023-12-31'` - ❌ 禁止左模糊查询:`WHERE logurl LIKE '%index'` → ✅ 改用右模糊:`LIKE 'index%'` - ⚠️ 控制`IN`列长度:`IN`条件超过50个值时分批查询 --- #### 二、查询优化(执行效率提升) 1. **分页优化**:避免`LIMIT 100000,10`式深分页 ```sql -- 低效:扫描前100000行 SELECT * FROM table ORDER BY id LIMIT 100000, 10; -- 高效:通过id定位 SELECT * FROM table WHERE id > 100000 ORDER BY id LIMIT 10; ``` **原理**:利用主键/索引直接定位数据偏移量,减少全扫描[^2] 2. **聚合查询优化** - 用`COUNT(1)`替代`COUNT(*)`:减少解析字段开销 - 实时性要求低时:用定期更新的统计替代`COUNT()` --- #### 三、结构优化(存储层) | 优化点 | 操作示例 | 效果 | |----------------------|------------------------------|--------------------------| | **字段类型精简** | `VARCHAR(255)`→`VARCHAR(32)` | 减少磁盘I/O,提升缓存效率 | | **大字段分离** | 拆分TEXT/BLOB到副 | 降低主体积20%-50% | | **分区** | 按日期分区`PARTITION BY RANGE` | 查询时仅扫描相关分区 | --- #### 四、服务器配置调优(基础支撑) ```ini # my.cnf 关键参数(60万数据量建议值) innodb_buffer_pool_size = 2G # 缓存池设为可用内存的60%-70% innodb_log_file_size = 256M # 减少日志刷新频率 query_cache_type = 0 # 关闭查询缓存(MySQL 8+默认关闭) ``` --- #### 五、缓存策略(应用层) 1. **热点数据缓存**:用Redis缓存高频查询结果(如最近7天数据) 2. **异步处理**:耗时操作(报生成)转入消息队列(如RabbitMQ) > 💡 **性能基准**:优化后60万数据典型查询响应应 <100ms(普通SSD服务器) ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值