(一)硬件方面
如果数据量大,每次访问数据量小,交互频繁,并发高,OLTP型应用系统,就要选取功能好的CPU和网络设备。如果数据量超大,每次访问数据量小,并发低,也就是OLAP应用,就对CPU要求不高,但是要求存储大,最好做集群。
(二)MySQL数据库系统启动参数配置
几个常见的参数设置:
query_cache_size:对热点数据进行缓存,提高命中率。
sort_bufer_size:在需要排序时,分配指定大小的内存进行排序。否则会进行磁盘IO排序,性能很低。这个参数不能随便设置过大。
read_bufer_size:查询时分配该大小的内存作为缓存。一般来说配置修改不需要经常变动,要慎重。
(三)表结构优化
数据类型优化,减少不必要的列,减少关联,设计的三范式要求,视图的使用等等。
(四)SQL语句和索引优化
索引可以大大减少服务器扫描的数据量,避免排序。
单列索引:最好是常用的列,离散型高,长度适中的。
多列索引:建立合适的组合索引,如果经常用到多个单列索引,最好考虑这个,顺序优先将选择性高的放在前面。
聚簇索引:数据访问更快,直接从索引节点获取数据,减少磁盘IO。缺点:提高了IO密集型应用,插入性能严重依赖插入顺序,最好按照主键顺序插入。更新聚簇索引的代价很高。
覆盖索引:只需要访问二级索引,不需要访问数据,减少数据访问量,explain的时候,如果extra是using index,表示使用了覆盖索引。
特定语句优化:
count:在业务上如果可以用近似值,可以的话,可以使用explain的rows或者对这个值进行缓存,定时刷新。myisam引擎统计很快,因为不需要再次扫描统计。
关联查询优化:被关联的列上一定要建立索引,确保groupby和orderby字段没有分布在2个表,否则不能使用索引完成排序。
优化limit分页:分页使用扫描偏移量大小数据,然后只截取部分数据,非常耗性能。可以尝试下面2个手段,使用一个覆盖索引子查询分页,查询出符合条件的主键ID,然后与原表关联查询出所有数据。覆盖索引可以大大减少扫描页面。