1、对SQL语句、索引、表结构等进行优化。
2、开启查询缓存,Query Cache缓存了SELECT查询及其结果数据集,当执行一个同样的SELECT查询时,MySQL会从内存中直接取出结果,加快了查询执行速度、减小了数据库的压力。执行SHOW VARIABLES LIKE ‘have_query_cache’;可以查看MySQL查询缓存是否打开,开启查询缓存只需配置my.cnf文件即可,具体如下:
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 1M
保存好后重启MySQL。
3、选用InnoDB存储引擎,MySQL常用存储引擎是MyISAM和InnoDB,二者区别如下:
MyISAM
查询速度快;
支持表级锁,在上锁期间表上不能进行其他操作;
支持全文检索;
支持数据压缩、自我复制、查询缓存、数据加密;
不支持外键;
不支持事务,所以也就没有COMMIT和ROLLBACK操作;
不支持集群数据库。
InnoDB
支持行级锁;
支持外键,对外键约束强制;
支持事务,可执行COMMIT和ROLLBACK操作;
支持数据压缩、自我复制、查询缓存、数据加密;
可用在集群环境,但并不完全支持。InnoDB表可以转换为NDB存储引擎,这样就能用在集群环境。
对数据库优化我认为可以分一下步骤进行:
1、表结构优化;
根据实际项目的业务逻辑,对表结构进行合理拆分,和合并;减少数据冗余;适度的反范式。
对表字段选择适当的字段类型;
2、sql语句优化;
针对一下特定的SQL查询进行优化,可以开启mysql慢日志,锁定慢查询语句然后进行查询优化;具体的优化方案还得根据实际业务来定;比如select * 替换 具体的查询字段;OR改写为IN()查询;查分join查询等等;
3、合理构建索引,优化索引,避免滥用;
建立索引被多少人认为是提升数据库性能的审计,于是甚至有人说把where后面所有的查询字段都加上索引;需要搞清楚的是,索引的确可以大大提高查询效率,但是索引对应添加和更新数据,增加了大量的I/O,而且对表的存在空间增大;不合理的索引反而成了累赘。
4、构建集群;
搭建数据库集群,配合数据库中间件实现读写分离负载均衡;
5、存储业务拆分;
对于一些业务和数据通过其他方式存在进行优化,比如检索字段可以用ES或者Solr进行查分。
MySQL的优化要根据实际业务,并没有什么通用的优化。
其实其他回答都说的很全,
但是我从比较实际的地方说说吧。
第一、开启MySQL的slowLog
slowLog会记录MySQL执行过的慢查询,比较佛系的办法就是让它记录一段时间,
然后查看里面执行的语句。
第二、通过desc的方式来查看慢的原因
比如:SELECT * FROM tbl WHERE Date = CURDATE();
你可以通过执行 desc SELECT * FROM tbl WHERE Date = CURDATE();
这个时候Mysql就会显示执行这句sql的计划,
如果你发现是全表查询,这个时候尝试在Date上增加索引,
然后再跑一次DESC,这个时候你就会发现这句语句已经走了索引。
*通常这个办法能解决90%的慢查询问题。
当上面的问题都无法满足到你的时候,
建议可以参考Mysql官方的参数设定,
然后根据业务特性对MySQL进行特定优化。