死锁的条件:
1、占有资源。
2、这个资源是互斥的。
3、资源不可以抢占。
4、成环。
ACID
原子性、一致性、永久性、隔离性
数据的一致性是通过原子性保证。
InnoDB与MyISAM的区别:
1、事物的支持不同,InnoDB支持事物,而MyISAM不支持事物。
2、锁的颗粒大小不同,使得在某些场景下并发量可能差距会比较大,InnoDB的话支持行级锁,MyISAM支持到表级锁。
锁的加锁、查询这个数据是否有锁、释放锁等都是消耗系统资源的。
3、缓存的内容不一样(MyISAM缓存索引,而InnoDB缓存数据和索引)。
mysql引擎:InnoDB、MyISAM、MEMORY、MERGE
(MyISAM适用于读多写少的场景)
InnoDB适用于,单机3~5个T。在10个T以后,建议使用数据仓库的方式。
大概10000事务数/s
大型系统,采用infobright,建立元数据信息表,用来执行多个应用分布在多表的查询。
InnoDB是MYSQL默认的事务性引擎,最重要,最广泛,常用于处理大量短期事务。
索引的优点:
1、索引大大减少了服务器需要扫描的数据量。
2、索引可以避免中途建立临时的表,来对查找到的数据进行排序。
3、索引可以把随机I/O变成顺序I/O。
索引设计的原则:
sql语句中经常使用where的使用索引。
字符串使用短索引(通过增量的方式搜索字符串)
联合索引
建立如(A,B,C)的索引。
如查找where A=1 and B=2
在查找的时候先查找A,再查找B。
如果用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。
如果使用(A,C)这样的数据来检索的话,就会先找到所有A的值然后匹配C,此时联合索引是失效的。
建立一个(A,B)的索引与分别建立A与B的索引,效果是不同的
最常见的是B索引。
目前更多的是B+索引。
InnoDB采用聚簇索引,索引与数据是顺序,所以可以缓存数据和索引。
MyISAM采用非聚簇索引,。
聚簇索引:把数据与索引放在一起,那么InnoDB可以缓存数据
查询索引:
1、是否检索大量超过需要的数据
2、mysql是否需要扫面额外的记录
响应时间:等待I/O、等待行锁
错误的索引,where actor_id +1 =5 ,这个行为是无法使用索引的,因为索引没办法解析这个加法。
所以应该简化,where条件。
一般情况下,索引应该选择重复值较少的列。(当不存在值重复的索引,称为唯一索引)
前缀索引:是一种能使索引更小、更快的有效方法,
where a=2 and b=3 此时应该选择 (a,b) 还是选择 (b,a)作为索引。
需要选择,选择性较高的那个列来作为索引,也就是选择了a=2后,数量比较少了。
可以创建(sex,rating)索引于下面的查询:
mysql > SELECT
explain SELECT * FRROM XX WHERE XX
可以解析出,预估需要访问多少行
事务的使用:
START ABC
SELECT XXX
INSERT XXX
COMMIT;
//COMMIT后才提交该事物、
数据库隔离级别:
越低级,系统资源的消耗越低。
1、未提交读(会出现脏读,事务B读取了事务A尚未提交的数据。比如A事物为修改数据后添加,B事物也是修改后添加,可能出错)
2、提交读(避免了脏读,但是出现不可重复读,大多数数据库默认是READ COMMITED。
事务含了其他事务:那么A中两次查询出现查询不同,则表示为不可重复读。
3、可重复读(避免了不可重复读,不允许其他事务对该事务数据进行操作,保证该事物中多次对数据的查询结果一致。但是对于一个事物的区间查询,
比如用户表,查询年龄在25~30之间的时候,其他事物虽然没对这些查询的内容进行修改,但是insert插入了一条age为26的信息。)
4、可串行化(所有事务串行)
MYSQL默认采用事务AUTOCOMMIT。
MVCC(muti-version concurrent version)多版本并发控制,有时候避免加锁,使得开销降低:
就是每个事务读一个数据表的快照(每隔一段时间把数据库拍照),根据事务开始的时间定读啥样的快照,
这样就会出现不同事务在同一时刻读不同的表。
实现:对表中每行数据,在默认添加隐藏的两列,表示这个列的版本与过期时间。
那么每个事务都有一个版本,某一次事务只读取版本号比起小的数据,实现快照原理(缺点,需要比较多的时间和空间来保存快照)
MYSQL性能优化:
1、使用合适的数据类型
2、设计合适的索引,写操作的时候,会需要维护索引,但是可以加快读的时间。
ORM(关系对象映射)
关于读写阻塞(MyISAM读写互相阻塞,InnoDB根据事务隔离级别不同)
数据库集群:
一主一从、主从复制、数据分片、
数据库实现高可用:
1、避免单点失效
mysql的话,索引被频繁调用的时候,会出现一个叫“自适应hash索引”,
其是在某些索引被频繁调用,那么用少量的空间来换取时间上的更快。
CRC32()、SHA1()、等hash函数,计算出一个比较小的字符串。
游标:
提供只读服务,单向可读,mysql游标指向的对象都是存储在临时表中。
mysql分区表:
通过PARTITION BY 子句,定义每个分区存放的数据
分区是一个独立的逻辑表,底层由多个物理子层组成,实现分区的代码实际上是对底层表的封装。
分区对SQL层是透明的。
一个表最多有1024个分区。
分区表的索引
(给每个分区表一个完全相同的索引,当查询一个分区表的时候,先打开锁并锁住所有的底层表)
InnoDB是目前MySQL中唯一支持外键的内置存储引擎。
外键强制使用索引,每次在一张表中做修改操作,都会对外键做一次查询,即便有索引还是有开销的。
外键约束,会使得查询的时候额外访问一些表,这也意味着额外的锁,有可能产生死锁。