mysql的性能优化有有三个层面
一、基于sql语句的优化
1. 避免在查询的列上进行运算,这样会导致索引失效
2. 使用join时 应用小结果集驱动大结果集,复杂的join可以进行拆分成多个query
3. like模糊查询的时候 避免时候双百分号 %%
4. 按需查询,仅查询出需要的字段 这样虽然不会增加查询速度 但是可以节省内存
5. 插入多条数据的时候 使用批量插入 可以节省交互次数
6. lmit基数比较大的时候 应该使用between
7. 不要使用rand获取多条随机记录
8.避免使用空值 因为使用空值的时候 mysql每次都会去检测是否为空
9. 获取数据数量的时候 使用count(*) 而不要去count(column)
10. 不做无谓的排序操作 需要排序的操作 尽可能的使用索引
二、基于mysql的配置
1.选择合适的数据库存储引擎
mysql有9种数据库存储引擎,分别是FEDERATED,MRG_MYSIAM,MyIAM,BLACKHOLE,CSV,MEMORY,ARCHIVE,InnoDB和PERFORMANCE_SCHEMA,常用的有MyISAM,InnoDB和MEMORY
在命令行下可以使用SHOW ENGINES;命令来查看数据库引擎,目前mysql5.5以上的默认存储引擎是InnoDB。
MyISAM存储引擎不支持事务,不支持外键,内存占用较低,所以访问速度较快。对事务没有完整性要求并且以访问为主的应用选择MyISAM存储引擎
InnoDB在事务上有优势,锁的粒度精确到行锁,但是对比MyISAM,消耗的内存空间大,在需要对数据进行频繁更新、删除操作并且要实现并发控制应该选用InnoDB存储引擎
MEMORY引擎使用内存来存储数据,数据访问速度很快,但是安全上没有保障,对于需要快速访问,并且涉及数据较小重要性不高的时候,应该选用此引擎
如果进行主从配置的时候,把读与写的操作进行分离的话,那么主服务器应该选用InnoDb存储引擎,而从服务器只进行读的操作,选择MyISAM是最优的选择,对于MEMROY的使用场景,也可以考虑使用memcache或者redis来代替,存储session的时候,最 优的方案是redis,因为内存中的数据容易丢失,redis数据库有持久化的过程,对数据的稳定和安全性有保障
2.调整数据库配置
关闭不必要的二进制查询日志和慢查询日志,启用日志会对占用内存,内存虽然很便宜,但是比硬盘要贵的多
适度使用query cache 缓存是一项非常有用的技术 而且无处不在 合理使用缓存带来的优势是非常大的
在配置中增加mysql的最大连接数
在表中删除大量行后,会留下许多的数据碎片,利用OPTIMIZE TABLE tablename;命令可以对数据表进行碎片整理
三、应用层面
1.数据比较庞大的时候,可以对数据的id进行哈希之后,分区分表操作,减少单表的体积,可以增加查询的效率
2.必要的使用使用NOSQL解决方案,两者相互配合
3.可以把硬盘升级成固态硬盘,普通硬盘因为机械臂读取数据的局限性,比固态硬盘读取数据的方式要慢的多
4.MYSQL是开源的产品,可以对mysql软件进行二次开发,针对所对应的业务进行优化操作