一、硬件层面优化
innodb_buffer_pool_size)分配50%-80%的可用物理内存(如16GB内存可分配8-12GB),用于缓存数据和索引,减少磁盘I/O。二、配置文件调优
innodb_buffer_pool_size:设置为总内存的70%左右(如8GB内存设为5.6GB),用于缓存InnoDB表的数据和索引,是影响InnoDB性能的关键参数。tmp_table_size和max_heap_table_size:增加临时表的大小(如均设为256MB),避免大查询因临时表溢出到磁盘而变慢。key_buffer_size:若使用MyISAM引擎,设置为10-20MB(MyISAM索引缓存);若仅用InnoDB,可设为10MB以下(避免浪费内存)。max_connections:根据服务器资源和应用需求设置(如300-500),避免过多连接导致内存耗尽;同时调整thread_cache_size(如设为16),减少线程创建和销毁的开销。innodb_thread_concurrency:设置为CPU核心数的1-2倍(如4核设为4-8),控制InnoDB的并发线程数,避免线程争抢资源。innodb_flush_log_at_trx_commit:设为2(每秒刷新日志到磁盘),兼顾性能与数据安全性(仅在允许少量数据丢失的场景下使用);若需强一致性,设为1(默认,每次提交都刷新)。query_cache_size:MariaDB 10.2及以上版本默认禁用查询缓存(query_cache_type=OFF),若应用有大量重复查询且数据更新不频繁,可启用(query_cache_size=64M,query_cache_type=1),但需注意高并发写入场景下可能降低性能。三、索引优化
CREATE INDEX idx_user_id ON orders(user_id)),避免全表扫描。CREATE INDEX idx_name_age ON users(name, age)),注意索引列的顺序(将选择性高的列放在前面)。DROP INDEX idx_unused ON table_name)。WHERE YEAR(create_time) = 2025),这会导致索引失效;使用EXPLAIN分析查询计划,确认是否使用了正确的索引。四、查询语句优化
EXPLAIN SELECT ...查看查询执行计划,重点关注type(访问类型,如ALL表示全表扫描,需优化)、key(使用的索引)、rows(扫描的行数)等字段,找出性能瓶颈。SELECT id, name FROM users),减少数据传输量和内存占用。OR连接条件(如WHERE status = 1 OR status = 2),可改用IN(WHERE status IN (1, 2));避免在索引列上使用!=、>、<等操作符,这会导致索引失效。SELECT u.name, o.order_id FROM users u JOIN orders o ON u.id = o.user_id),减少查询次数。LIMIT offset, size时,避免大偏移量(如LIMIT 10000, 10),可改用WHERE id > last_id LIMIT 10(记录上一页的最后一条ID),减少扫描行数。五、定期维护
OPTIMIZE TABLE table_name(如每月一次),整理表碎片,回收空间,提高查询效率(适用于频繁更新的表)。expire_logs_days=14,设置日志保留14天)和慢查询日志(slow_query_log=1,开启慢查询日志),避免日志文件过大占用磁盘空间。ANALYZE TABLE table_name手动更新,帮助优化器做出更好的查询计划。六、缓存策略
query_cache_type=1),可通过SHOW STATUS LIKE 'Qcache%'监控命中率(Qcache_hits / Com_select),若命中率低于50%,说明查询缓存效果不佳,可调整大小或关闭。七、监控与分析
slow_query_log=1,slow_query_log_file=/var/log/mysql/slow-queries.log,long_query_time=2),记录执行时间超过2秒的查询,定期分析并优化。SHOW STATUS(如SHOW STATUS LIKE 'Threads_connected')、SHOW PROCESSLIST(查看当前连接和查询)实时了解数据库状态,快速定位问题。