数据库相干
数据库1.索引的种类:
聚簇(合)索引,次要索引,覆盖索引,复(连)合索引,前缀索引
2.建议创建索引的环境:
[*]主键自动建立唯一索引。
[*]频繁作为查询的条件的字段应该创建索引。
[*]查询中与其他表关联的字段,外键关系建立索引。
[*]查询中排序的字段,排序字段若通过索引去访问将大大提高排序的速度。
[*]查询中统计或者分组字段。
3.不建议创建索引的环境:
[*]表记录太少。
[*]经常增删改的表。
[*]数据重复且分布均匀的表字段。
[*]频繁更新的字段。
4.索引失效的环境:
1.对索引列举行函数运算。
SELECT * FROM users WHERE YEAR(created_at) = 2024;
2.隐式范例转换
当查询条件里的索引列和查询值范例不一致,数据库会举行隐式范例转换,从而导致索引失效。若 id 列是整数范例,而查询值是字符串范例,就会发生隐式范例转换,让索引失效。
SELECT * FROM users WHERE id = '123';
3.索引列使用了OR操作符
4.含糊查询以通配符%开头
5.符合索引未遵照最左前缀原则
6.查询条件中使用!=或<>
7.使用is null和is not null
8.字符串不添加引号
9.两表关联使用的条件字段中字段的长度、编码不一致
10.MySQL中使用全表扫描比使用索引快
5.事务的特性:
[*]原子性(Atomicity):事务开始后全部操作,要么全部做完,要么全部不做,不大概停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,全部的操作就像没有发生一样,也就是说事务是一个不可分割的整体。
[*]一致性(Consistency):事务开始前和结束后,数据库的完整性束缚没有被粉碎 。比如A向B转账,不大概A扣了钱,B却充公到。
[*]隔离性(Isolation):同一时间,只允许一个事务哀求同一数据,不同的事务之间彼此没有任何关扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
[*]持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。
6.隔离级别
读未提交:READ UNCOMMITTED
如果一个事务读到了另一个未提交事务修改过的数据,那么这种隔离级别就称之为未提交读。
读已提交:READ COMMITTED
如果一个事务只能读到另一个已经提交的事务修改过的数据,而且其他事务每对该数据举行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为已提交读。
可重复读:REPEATABLE READ
事务B只能读到事务A已经提交的事务修改过的数据,但是第一次读过某条记录后,即使其他事务修改了该记录的值而且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读。
串行化:SERIALIZABLE
即事务之间的执行是串行的,当一个事务在操作的时候,另外的事务就只能等,必须等到该事务提交或者回滚,别的的事务才气继续操作。
脏读:事务A对数据做的修改,即使没有提交,对于事务B来说也是可见的。
不可重复读:事务 B 多次读取同一数据,事务 A 在事务B多次读取的过程中,对数据作了更新并提交,导致事务B再次读取同一数据时,效果不一致。
幻读:事务 A 在查询数据时,事务 B 插入了新的数据并提交,事务 A 再次查询时会发现多出了一些数据,就像出现了幻觉一样。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
7.分库分表
分库分表就是为相识决由于数据量过大而导致数据库性能低落的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而到达提升数据库性能的目的。
分库分表中通常包括:垂直分库、水中分库、垂直分表、水中分表四种方式。
垂直分表:将一个表按照字段分成多表,每个表存储此中一部门字段。
水中分表:在同一个数据库内,把同一个表的数据按肯定规则拆到多个表中。
垂直分库:按照业务将表举行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。
水中分库是把同一个表的数据按肯定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
对于同一时刻有大量并发读操作和较少写操作范例的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。
8.锁
锁的分类:
[*]基于锁的属性分类:共享锁、排他锁。
[*]基于锁的粒度分类:表锁、行锁、记录锁、间隙锁、临键锁。
[*]基于锁的状态分类:意向共享锁、意向排它锁。
锁的部门结论:
[*]ddl会自动提交事务,意味着在提交后会自动释放锁 。
[*]共享锁与共享锁是兼容的,排它锁与任何锁都不兼容。
[*]在非Serializable级别下,select语句默认是不加任何锁的,Serializable级别下查询语句如果开启事务,默认是共享锁。
[*]update、delete、insert语句默认加排它锁。
[*]默认环境下,mysql在执行一条独立的sql语句时,会自动开启事务,自动提交事务,当提交事务后就自动释放锁。
[*]锁会在事务结束时,释放掉。
[*]可以给select语句强行加共享锁,只要在select语句之后添加上 lock in share mode即可。
[*]可以给select语句强行加排它锁,只要在select语句之后添加上 for update 即可。
属性锁:
共享锁:又称读锁,简称S锁,在一个事务访问某张表的时候,允许另一个事务对同一张表举行查询操作。
行级排它锁:又称为写锁,简称X锁,在一个事务修改(insert/update/delete)某张表的某条数据时,不允许另一个事务修改同一条数据。
表锁:上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才气举行对表举行访问。
记录锁:锁表的某一行记录。
间隙锁:属于行锁中的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,防止别的事务在这个地区内插入、修改、删除数据,这是为了防止出现幻读现象,当表的相邻ID之间出现空隙则会形成一个区间。
临键锁:属于行锁的一种,而且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的全部间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。
意向锁:当事务A加锁乐成之后就设置一个状态告诉后面的人,已经有人对表里的行加了一个排他锁了,你们不能对整个表加共享锁或排它锁了,那么后面需要对整个表加锁的人只需要获取这个状态就知道自己是不是可以对表加锁,避免了对整个索引树的每个节点扫描是否加锁。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]