MySQL性能优化的方法
1.系统参数配置优化
innodb_log_buffer_size:InnoDB存储引擎的事务日志所使用的缓冲区,一般来说不建议超过32MB
wait_timeout:数据库连接闲置时间,闲置连接会占用内存资源。可以从默认的8小时减到半小时
max_user_connection:最大连接数,默认为0无上限,最好设一个合理上限thread_concurrency:并发线程数,设为CPU核数的两倍
innodb_additional_mem_pool_size:InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,当数据库对象非常多的时候,适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率,当过小的时候,MySQL会记录Warning信息到数据库的错误日志中,这时就需要该调整这个参数大小
innodb_buffer_pool_size:缓存数据块和索引块,对InnoDB表性能影响最大。通过查询show status like 'Innodb_buffer_pool_read%',保证 (Innodb_buffer_pool_read_requests– Innodb_buffer_pool_reads)/ Innodb_buffer_pool_read_requests越高越好
。。。。。。
2.表结构优化
使用数据库表结构符合三大范式与 BCNF
设计符合第三范式的表结构
尽量使用数字型字段,提高数据比对效率。
对定长、MD5哈希码、长度较短的字段使用char类型,提高效率;对边长而且可能较长字段使用varchar类型,节约内存。
适当的进行水平分割与垂直分割,比如当表列数过多时,就将一部分列移出到另一张表中。
3.索引优化
值分布很稀少的字段不适合建索引,例如`性别`这种只有两三个值的字段
字符字段最好不要做主键
字符字段只建前缀索引
尽量不用 UNIQUE,由程序保证约束
不用外键,由程序保证约束
使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引
尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描
4.SQL语句优化
使用联合 UNION 来代替手动创建的临时表
尽量避免使用子查询,使用连接 JOIN 来代替子查询
避免函数索引及数据类型不一致
禁止不必要的 order by 排序
用 IN 代替 OR
可通过开启慢查询日志来找出较慢的 SQL 语句
不做列运算,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边
sql 语句尽可能简单,一条 sql 只能在一个 cpu 运算。大语句拆小语句,减少锁时间,一条大 sql 可以堵死整个库
尽量避免在 WHERE 子句中使用 != 或 <> 操作符,不使用 select * 全查,否则将引擎放弃使用索引而进行全表扫描
5.读写分离
搭建读写分离架构,master 只负责写,slave 只负责读sousuoyindi
6.缓存
mysql 前置缓存服务器(redis)
针对前端 web 页面做缓存
系统内部调整相关缓存参数
7.分库分表
如果表或库数据量实在太大,需要开发进行分库分表(视情况而定)
另有引擎优化及硬件优化(此为道听途说,未实际验证)
根据实际情况选择最合适的引擎
根据 MySQL 是 CPU 密集型还是 I/O 密集型,通过提升 CPU 和内存、使用 SSD 等方式能显著提升 MySQL 性能
mysql 是关系型数据库,适合垂直升级
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本