这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
查询性能的优化方法
减少请求的数据量
- 只返回必要的列:最好不要使用 SELECT * 语句。
- 只返回必要的行:使用 LIMIT 语句来限制返回的数据。
- 缓存重复查询的数据:使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。
减少服务器端扫描的行数
- 最有效的方式是使用索引来覆盖查询。
InnoDB 和 MyISAM 的比较
- 事务:MyISAM不支持事务,InnoDB支持事务;
- 全文索引:MyISAM 支持全文索引,InnoDB 5.6 之前不支持全文索引;
- 关于 count( ):MyISAM会直接存储总行数,InnoDB 则不会,需要按行扫描。意思就是对于 select count( ) from table; 如果数据量大,MyISAM 会瞬间返回,而 InnoDB 则会一行行扫描;
- 外键:MyISAM 不支持外键,InnoDB 支持外键;
- 锁:MyISAM 只支持表锁,InnoDB 可以支持行锁。
水平切分和垂直切分
- 水平切分
水平切分是将同一个表中的记录拆分到多个结构相同的表中。当一个表的数据不断增多时,水平切分是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。
- 垂直切分
垂直切分是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。例如:将原来的电商数据库垂直切分成商品数据库、用户数据库等。
读写分离
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。
读写分离能提高性能的原因在于:
- 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
- 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
- 增加冗余,提高可用性。