MySQL 是一种关系型数据库,其默认端口是 3306.
字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序个规则。
MySQL中每一种字符集都会对应一系列的校对规则。
MySQL采用的是类似继承的方式指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值,它们逐层继承。比如:某个库中所有表的默认字符集将是该数据库所指定的字符集(这些表在没有指定字符集的情况下,才会采用默认字符集)
事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能导致以下的问题:
不可重复读和幻读的区别: 不可重复读的重点是修改比如多次读取一条记录发现其中的某些列的值被修改;幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。
SQL 标准定义了四个隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻影读 |
---|---|---|---|
READ-UNCOMMITTED(读取未提交) | √ | √ | √ |
READ-COMMITTED(读取已提交) | × | √ | √ |
REPEATABLE-READ(可重复读) | × | × | √ |
SERIALIZABLE(可串行化) | × | × | × |
MySQL InnoDB 存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读)
当 MySQL 单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
务必禁止不带任何限制数据范围条件的查询语句。比如当我们在查询订单历史的时候,我们可以控制在一个月的范围内。
经典的数据库拆分方案,主库负责写,从库负责读
根据数据库里面数据表的相关性进行拆分。例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。
简单来说垂直拆分是指数据表列的拆分**,把一张列比较多的表拆分为多张表**。如下图所示
保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。
水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。
水平拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以水平拆分最好分库。
因为要是分成多个表之后,每个表都是从 1 开始累加的,这样是不对的,我们需要一个全局唯一的 id 来支持。
生成全局 id 有下面这几种方式: