数据库优化
当通过客户端提交一条sql后,sql解析引擎会被启动,此时sql解析引擎会优化这条sql,它会帮我们选择一条最优的索引。接下来,数据库引擎会用这条sql命令语义去硬盘中查询数据,然后将数据返回,如果数据量过大,可能造成数据库IO繁忙,大大损伤sql效率,因此才有分页查询。
数据库优化可以分为两部分:
sql优化:要尽量避免全表扫描
- 索引:索引书数据库优化方案中,成本最低,见效最快的方案
- 预处理:数据主要有实时数据和历史数据
- 实时数据,数据量小,所以查询效率不会有问题,
- 而历史数据,数据量可能非常大,所以很容易出现查询效率问题,所以有了预处理,我们可以通过定时任务,在夜间对这部分数据进行查询存储 ,然后用的时候,直接操作结果的表就好。
- mysql like
- 增加缓存:可以使用redis进行缓存,将热数据拷贝到redis中,读写数据时,先到操作缓存数据。
- 数据库优化 - 分库分表分区
- 分库:按照业务分库,分流数据库并发压力
- 分表: 将大数据量的表分成较小的表,比如根据时间,每隔10天创建一个表,存储数据,以提高查询效率。
- 分区:设定好分区规则之后,数据会自动插入到相应分区,查询时也可以很快的找到对映分区。分区不能提高并发性能。还是一张表,但数据却存在不同位置。
- 数据库引擎
- 数据库搜索引擎,mysql主要有两个,innodb和myisam
- myisam的索引存储结构实在内存中,所以他的查询速率比innodb更高,但他是表级锁
- innodb虽然搜索效率较低,但他是行级索,在修改同一表时更具有优势
- 读写分离
案例:
delete或insert是 表级锁,如果操作的数据量太大的话,表可能会锁很长时间,导致后续操作阻塞(很多小但重要的查询不能及时返回),可能导致整个网站停止相应。
方法:可以加上limit 1000,每次只操作1000行。也可以每隔一段时间暂停一次,释放表让其他操作进来。
通过主从架构,主数据库负责写,从数据夫负责读。通过将主数据库数据同步到从数据库保证数据的一致性。