性能瓶颈
要正确的优化SQL,需要快速定位性能的瓶颈点。
索引
索引会大大增加表记录DML(insert、update、delete)的开销。一个表可以建多个索引,一个索引可以由多个字段组成。有些时候,只需要访问表中的几个字段,并且字段内容较少,可以为这几个字段单独建立一个组合索引。
性能优化是无止境的,当性能可以满足需求时即可,不要过度优化。在实际数据库中我们不可能把每个SQL请求的字段都建在索引里,所以这种只通过索引访问数据的方法一般只用于核心应用,也就是那种对核心表访问量最高且查询字段数据量很少的查询。
减少交互次数
数据库访问框架一般都提供了批量提交的接口。
设置Fetch_Size。当使用select查询数据库时,根据客户端fetch_size参数返回相应数量的记录。fetchsize并不会存在一个最优的固定值,因为整体性能与记录集大小及硬件平台有关。
mysql mysiam/innodb表存储引擎
当数据库有大量的写入、更新操作而查询比较少的时候选择innodb;当数据库主要以查询为主,更新和写入比较少并且数据完整性要求不难严格选择mysiam。mysiam表的查询操作效率和速度都比innodb快。
数据切分,分库分表
首先找到数据表的区分字段(主键),根据分库的规则将数据分散到各个数据库中。查询数据时,根据区分字段和分库规则,定位到目标数据库,称为DB路由。
分库降低了单个机器的负载;分表,提高了数据操作的效率。
垂直切分、水平切分
垂直切分根据业务是否紧密、表之间的关联程度分成独立的几个shared。
水平切分是一个shared内数据表的进一步切分。数据表的水平切分,表中要有冗余字段作为切分依据和标记字段。
另一点就是对数据表中经常变动的字段和固定字段的拆分,把经常变动的字段独立出来,记录在持久化类的缓存中。
读写分离
读写分离技术就是一个Master数据库,多个Slave数据库,Master库负责数据更新和实时数据查询,Slave库负责非实时数据查询。在实际应用中,数据库都是读多写少,但是读取数据通常耗时比较长。
读写分离适用于读远大于写的场景。