一、MySQL
数据库概念:数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合
关系型数据库:关系型数据库就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)
主键和外键的区别:
主键 :主键用于唯一标识一个字段,该字段中的数据不能有重复,不允许为空。一个表只能有一个主键。
外键 :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。
MySQL支持哪些存储引擎?默认使用哪个?
InnoDB:是MySQL默认的存储引擎,所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。
MyISAM:是MySQL5.5 之前默认的村粗引擎,该引擎不提供事务支持。
MEMODY:在功能上等同于MyISAM,但由于是将数据存储在内存中,速度快,特别适合与临时表
事务:事务是数据库操作的基本单元,逻辑上事务中的一组操作要么都成功全部执行,要么都失败全部不执行。
事务四大特性:
1、原子性( A ): 事务是最小的工作单元,不可再分,事务中的操作要么都发生,要么都不发生。
2、一致性( C ): 事务前后数据的完整性必须保持一致。
3、隔离性 ( I ): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。(不同用户的事务相互隔离)
4、持久性( D ): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。(数据提交后读数据的修改就是永久的)
脏读、不可重复读、幻读:
1、脏读: 一个未提交事务读取到另一个未提交事务的数据
当一个事务A正在访问数据并对数据进行了修改,而事务A还未提交,此时事务B对对该数据进行访问获得了修改后的数据,然后使用了该数据。因为事务A还未提交,所以事务B读到这个数据是脏数据,依据“脏数据”所做的操作可能是不正确的(比如事务A因为异常回滚,此时事务B使用的数据就是错误的)
2、不可重复读:一个未提交事务读取到另一个提交事务的修改数据
指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
3、幻读:一个未提交事务读取到了另一个提交事务的数据
MySQL定义的事务隔离级别(读取未提交、读取已提交、可重复读、可串行化)
1)READ-UNCOMMITTED(读取未提交) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
2)READ-COMMITTED(读取已提交) : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
3)REPEATABLE-READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
4)SERIALIZABLE(可串行化) : 最高的隔离级别,完全服从 ACID (事务四大特性)的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
MySQL默认隔离级别
MySQL默认的存储引擎为InnoDB,该引擎的默认支持隔离级别是REPEATABLE-READ(可重复读)
表级锁和行级锁
InnoDB存储引擎对行级锁和表级锁都是支持的,默认为行级锁。行级锁的细粒度更小,进对相关的记录上锁即可,对于并发写入来说,InnoDB的性能更高。
行级锁与表级锁区别:
表级锁: MySQL 中锁定粒度最大的一种锁,是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM 和 InnoDB 引擎都支持表级锁。
行级锁: MySQL 中锁定粒度最小的一种锁,是针对索引字段加的锁,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。
能用MySQL直接存储文件(如图片)吗
可以,直接存储文件转化的二进制数据即可,但是不建议使用数据库存储文件,否则会影响数据库性能且消耗过多的存储空间,可以选择云服务厂商提供的开箱即用的文件存储服务
Mysql如何存储IP地址
将IP地址转换为整形数据存储,性能更好,占用空间也小
MySQL提供两个方法处理ip地址:
INET_ATON() : 把 ip 转为无符号整型 (4-8 位)
INET_NTOA() :把整型的 ip 转为地址
插入数据前,先用 INET_ATON() 把 ip 地址转为整型,显示数据时,使用 INET_NTOA() 把整型的 ip 地址转为地址显示即可。
索引
将IP地址转换为整形数据存储,性能更好,占用空间也小
索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。
索引优点 :
使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
索引缺点 :
创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
索引需要使用物理文件存储,也会耗费一定空间。
索引类型:主键索引、唯一索引、普通索引、全文索引
1)主键索引:一张表中只有一个主键,且不能为null,不能重复
2)唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。
3)普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
4)全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。