1.数据库的三大范式
https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
1.1第一范式:每个列都不可以再拆分。(保证数据库每一列的原子性)
1.2第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。(保证每一列与的数据都与主键相关)
1.3第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。(确保每列都和主键列直接相关,而不是间接相关)
2.MySQL权限表
https://www.cnblogs.com/keme/p/10288168.html
2.1数据库权限的级别
全局性的管理权限: 作用于整个MySQL实例级别
数据库级别的权限: 作用于某个指定的数据库上或者所有的数据库上
数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象上
2.2数据库表
分别为user表
,db表
,tables_priv表
,columns_priv表
(一)user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
(二)db权限表:记录各个帐号在各个数据库上的操作权限。
(三)table_priv权限表:记录数据表级的操作权限。
(四)columns_priv权限表:记录数据列级的操作权限。
2.3数据库权限验证的流程
(一)身份验证:先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
(二)权限验证:通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
3char与varchar的区别
VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
VARCHAR存储的内容超出设置的长度时,内容会被截断。
CHAR是定长的,根据定义的字符串长度分配足够的空间。
CHAR会根据需要使用空格进行填充方便比较。
CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
CHAR存储的内容超出设置的长度时,内容同样会被截断。
4.使用枚举ENUM
https://blog.csdn.net/qq_41725214/article/details/79771842
使用枚举,底层利用数据进行存储,效率更高
5.innoDB与MyISAM存储引擎
(一)innoDB与MyISAM存储引擎区别:
1.对事务的支持不同,innoDB支持ACID事务,MyISAM不支持事务
2.采用的锁级别不同,innoDB支持行锁与表锁,MyISAM只支持表锁
3.对外键的支持不同,innoDB支持外键,MyISAM不支持外键
(二)innoDB索引与MyISAM索引的区别
1.索引类型不同,InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
2,索引叶子节点存储的数据不同,InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
6聚簇索引与非聚簇索引
https://www.cnblogs.com/jiawen010/p/11805241.html
7索引
(一)索引是一种特殊的数据结构,一般采用B树或者B+树,索引可以加快数据的查找与更新速度
(二)索引的优缺点
索引的优点
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
空间方面:索引需要占物理空间。
8覆盖索引
如果对查询的字段都建立了索引,那么在查询的过程中直接通过索引就可以访问到数据,而不需要访问原始的数据表,这就叫做覆盖索引,因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。
9 索引的分类
(一)主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
(二)唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引
(三)普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
(四)全文索引: 是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引
10 B+树,B树,hash索引的性质
(一)B+树
(1)非叶子节点不存储数据,只用作索引
(2)每个节点包含n个关键字,每个关键字代表一个子树,该关键字是其字数中最大的节点值
(3)所有的叶子节点按照关键字的依次相连
(二)B树
(1)可以将键和值存放在内部节点和叶子节点,叶子节点没有相连。把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率
(三)Hash索引
(1)使用hash表存储数据,key为数据计算出的hash值,value为数据值,若hash冲突,在对应Hash键下以链表形式存储
11.创建索引的原则
(一)创建索引的原则
(1)对于频繁查询的数据,适合创建索引
(2)非空字段:应该指定列为NOT NULL,在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。
(3)要注意最左前缀匹配原则,防止索引失效
(4)外健一定要建立索引
(4)对于长字段建立索引,要指定前缀长度
(二)你适合建立索引
(1)对于频繁更新或者修改的字段,不适合建立索引
(2)对于text,BLOB,bit类型的数据列不适合建立索引
(3)对于区分度不大的列不适合建立索引
12.创建索引与删除索引
(一)创建索引
(1)建表时创建索引
CREATE TABLE user_index (
id INT auto_increment PRIMARY KEY,
first_name VARCHAR (16),
last_name VARCHAR (16),
id_card VARCHAR (18),
information text,
KEY name (first_name, last_name),
FULLTEXT KEY (information),
UNIQUE KEY (id_card)
);
(2)修改表时
ALTER TABLE table_name ADD INDEX index_name(column_list);
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。索引名可以省略,会自动将所索引列中第一类作为索引名
(3)单独创建
CREATE INDEX index_name ON table_name (column_list);
该方法不能创建主键索引
(二)删除索引
ALTER TABLE drop KEY index_name;
对于主键索引,需要先改变其自增长特定,然后才能够删除
alter table user_index MODIFY id int,
drop PRIMARY KEY
13.前缀索引的建立
对于长文本字段需要建立前缀索引,避免字段内所有的内容都建立索引,使得索引的体积过大。
建立索引时,可以先查询该字段的平均匹配度
select count(*)/count(distinct left(password,prefixLen));
通过从调整prefixLen的值(从1自增)查看不同前缀长度的一个平均匹配度,越接近1,索引的区分度越好