数据库可以做哪些优化工作?
数据库优化工作
-
数据选型:合适的字段、类型,表越小查得越快。
-
范式应用:合理应用三范式和反三范式
-
存储引擎的选择:比如mysql若专门读取,可以使用myisam,需要写、事务操作选用innodb
-
索引优化:常用字段建立索引,使用时尽量覆盖索引、使用唯一索引、避免索引失效。还可以采用explain分析sql并优化,看是看是否用需要建立索引、出现索引失效等问题。explain结果注意type、ref、key、row字段。
- 注意type字段:all为全表扫描 < index为遍历整个索引树 < 通常达到range级别 < 最好是ref(是常数或字段,最好是个常数)。
- 注意ref和key字段是否用上索引字段。
- 注意row字段变化,表示需要遍历多少行才能找到,若通过优化,row大幅减小说明优化有效。
-
分库分表:当数据量大了以后性能就会下降,适当对数据库进行分库分表可以减少单张表的大小和数据库的压力。
分库分表工具有:如百度的heisenberg、阿里巴巴cobar、mycat(基于cobar)、sharding-jdbc(当当)
可以用sharding-jdbc来分库分表,以jar包的形式和项目整合,低侵入,简单配置直接使用,相对于其他需要部署的分库分表工具,可以将更多精力放在业务开发而不是运营上
- 垂直拆分:(按逻辑拆分)
- 对于数据库:专库专用,比如订单微服务专门管理订单库,商品微服务专门管理商品库,微服务之间对外提供API来操作数据库。
- 对于表:复杂表拆成简单表,降低细粒度,比如商品库的表,可以按类型区分为家电、办公、食品等,sku、spu信息等,将拆分的表分散到不同数据库中。垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表
- 水平拆分:(按大小拆分)
- 对于数据库:针对同一种数据库,数量过大,拆分为多个子库,如订单库1、订单库2
- 对于表:针对同一种表,拆分为子表,如订单表1、订单表2。水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。
- 分表策略:可以按时间段、id区间(比如按userid分,1-100W、100W-200W)、按hash函数(比如函数为id%2,就是按奇偶id)分表
- 垂直拆分:(按逻辑拆分)
-
读写分离:从机用来读,主机用来写。
-
使用缓存:使用redis作为缓存数据库,挡在关系型数据库前。
-
查看分析慢查询日志:
-- 开启慢查询、设置慢查询时间 SET GLOBAL slow_query_log=ON/OFF; SET GLOBAL long_query_time=n;