MYSQL:事务隔离级别默认为 repeatable Read(可重复读)。
优化途径:1:存储数据前选择合适的表结构,字段结构;
2:随着业务的发展,垂直分割表,拆分表;
3:使用过程选择合适的查询语法,修改语法;
解决方案:
1:mysql创建表时候会选择存储引擎,可供选择的大概有七个引擎,常用的就两种:InnoDB和MyISAM 。MyISAM支持全文检索,如果你的数据是只存储只查询的话,例如日志内容,推荐使用该存储引擎,如果你有修改操作,不要使用该存储引擎,因为行级操作也会导致表锁,只要有修改就会串行化执行,这种效率是极低的。
InnoDB是一个非常复杂的存储引擎(具体怎么复杂我也不清楚),对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务,并且mysql的事务隔离机制 repeattable Read是会导致幻读现象的,InnoDB通过版本并发控制解决了这个问题。
我自己大部门项目我默认都会使用InnoDB,对于大量读操作的场景,如果需要全文检索推荐使用es,如果日志数据推荐使用mongoDB。
2:避免使用 SELECT * 。
3:如果操作数据时候根据主键id来的 末尾可加上 LIMIT 1。
4:创建合适的索引,索引是提高查询销量最简单粗暴的方法。
5:表关联后的ON后面的条件 两个字段使用相同类型的字段,创建索引,表关联操作尽量不要超过三个表,如果业务复杂最好通过代码去拆分处理。
6:字段对应存储的值是相对固定的字符串值,比如存储性别,城市,状态,能用int用int,想要表达含义的话可以用enum,而不要用varchar。
7:悲观锁 for Update 语法 一定要用到索引,不然执行过程中就会造成表锁
8:如果业务越来越复杂,可以对一个复杂的对象进行拆分,常用字段,主要字段放在一张主表内,不常用字段放在副表内。总之表越小越快。
9:如果用户量上来,数据量扩增起来后,可以尝试对表拆分为读写分离方案,分库分表方案。