Mysql

Mysql

mysql
1.索引
1.1.普通索引(index)
1.1.1.数据可以重复,没有任何限制
1.2.唯一索引(unique)
1.2.1.引列的值必须唯一,但允许有空值
1.3.主键索引
1.3.1.特殊的唯一索引,不允许有空值
1.4.复合索引
1.4.1.在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
1.5.外键索引
1.5.1.只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作
2.explain
2.1.table
2.1.1.表名
2.2.type
2.2.1.显示了连接使用了哪种类别
system
• 表只有一行
const
• 表只有一行匹配,并在查询开始时就被读取,因此被优化器视为常数
eq_reg
• 每次匹配时只会读取一行。当主键或者唯一非空索引的全部部分被使用时会出现
ref
• 每次匹配时会读取所有匹配行,当用到了非唯一索引或者唯一索引的一部分时会出现
ref_or_null
• 与ref相同,并且mysql还会搜索包含null值的行
range
• 根据索引选取一定范围内的行
• ken_len列表示使用到的最长的索引部分
index
• 从索引中获取所有的数据,不需要访问原表
• 根据索引的顺序进行全表扫描
ALL
• 全表扫描
2.3.possible_keys
2.3.1.可能用到的索引
2.4.key
2.4.1.实际使用的索引,不一定在possible_keys中存在
2.5.key_len
2.5.1.表示使用索引的长度,可以用来判断多列索引中的哪些部分被使用到
2.6.rows
2.6.1.检查的行数,innodb引擎是个估计值
2.7.filtered
2.7.1.过滤后得到行数的百分比,rows*filtered/100 表示实际用于join的行数
2.8.extra
2.8.1.using where
使用了where子句来筛选数据
2.8.2.using index
从索引中获取全部数据,不需要访问原表
2.8.3.using temporary
需要使用临时表来保存结果
2.8.4.using filesort
需要对取得的行进行排序,并保存排序的索引,行数据会按照索引的顺序被检索
3.视图
3.1.一个表或者多个表的行或列的子集。视图本身不独立存储在数据库中,是一个虚表
3.2.优点
3.2.1.视图能够简化用户的操作
3.2.2.能以多种角度看待同一数据
3.2.3.为数据库提供了一定程度的逻辑独立性
3.2.4.对机密数据提供安全保护
4.三范式
4.1.1NF是对属性的原子性约束,要求字段具有原子性,不可再分解
4.2.2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键
4.2.1.消除复合主键就可避免出现部分依赖,可增加单列关键字
4.3.3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖
4.3.1.将一个实体信息的数据放在一个表内实现
5.脏读、不可重复读、幻读
5.1.脏读
5.1.1.务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的
5.2.不可重复读
5.2.1.一个事务范围内的两次相同查询却返回了不同数据
5.3.幻读
5.3.1.当事务不是独立执行时发生的一种现象,比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么就会发生,操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
6.事务隔离级别
6.1.Read Uncommitted读未提交
6.1.1.B事务还没提交,A事务就能实时读到数据,出现脏读
6.2.Read Committed读提交(Oracle默认)
6.2.1.当每个对象在写的时候,数据库会记住已经被提交的旧值和当前事务持有写锁设置的新值。当一个事务还在进行中,那么其他事务读取到的就是旧值。只有当新值被提交的时候才会被其他事务读取到
6.2.2.如果其他事务想要去写相同的数据对象,它必须等到上一个事务提交或者回滚然后去得到这把锁
6.2.3.会出现不可重复读或者读倾斜
6.3.Repeatableread可重复读(mysql默认级别)
6.3.1.确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新
6.4.Serializable序列化
6.4.1.不允许读写并发操作,写执行时,读必须等待
7.MyISAM、InnoDB
7.1.InnoDB
7.1.1.支持事务
7.1.2.支持外键
7.1.3.支持并发
7.1.4.支持行级锁
7.2.MyISAM
7.2.1.不支持事务
7.2.2.查询速度快,不能读写操作太频繁
7.2.3.支持表级锁
8.CHAR、VARCHAR
8.1.CHAR
8.1.1.固定长度的类型
8.1.2.使用场景
 存储具有近似得长度(md5值,身份证,手机号),长度比较短小得字符串
适合经常更新得字符串,更新时不会出现页分裂得情况,避免出现存储碎片,获得更好的io性能
8.2.VARCHAR
8.2.1.可变长度的类型
8.2.2.使用场景
字符串很少被更新,容易产生存储碎片
字符串列得最大长度比平均长度大很多
使用多字节字符集存储字符串
9.存储过程
9.1.预编译的SQL语句
9.2.只需创建一次,以后在该程序中就可以调用多次
10.sql调优
10.1.创建必要的索引
10.1.1.在 where 及 order by 涉及的列上建立索引
10.2.使用预编译查询
10.2.1.不仅可以避免SQL注入漏洞攻击
10.2.2.数据库会对这些参数化SQL进行预编译
10.2.3.第一次执行时会为这个SQL进行查询优化并执行预编译,以后再执行这个SQL时就直接使用预编译的结果
10.3.调整Where字句中的连接顺序
10.3.1.自下而上的顺序解析where字句
10.3.2.将from后面的多张表,按照记录最少的表排在最后
10.3.3.where条件中,能筛选掉最多记录的条件放在最后
10.4.用where字句替换HAVING字句
10.4.1.HAVING只会在检索出所有记录之后才对结果集进行过滤
10.4.2.where则是在聚合前筛选记录
10.5.使用表的别名
10.5.1.减少解析时间、并减少那些列名歧义引起的语法错误
10.6.用EXISTS替代IN、用NOT EXISTS替代NOT IN
10.7.避免在索引列上使用计算
10.8.避免在 where 子句中对字段进行 null 值判断
10.9.能用 between 就不要用 in
11.SQL注入
11.1.程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行
11.2.开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置
11.3.执行sql语句时使用addslashes进行sql语句转换
12.索引使用 B+ 树
12.1.二叉树
12.1.1.任意节点左子树不为空,则左子树的值均小于根节点的值
12.1.2.任意节点右子树不为空,则右子树的值均大于于根节点的值
12.1.3.任意节点的左右子树也分别是二叉查找树
12.1.4.没有键值相等的节点
12.2.AVL树
12.3.红黑树
12.4.B树
12.5.B+树
12.5.1.非叶子节点只保存索引,数据都保存在叶子节点中
12.5.2.只需要去遍历叶子节点就可以实现整棵树的遍历
12.5.3.磁盘读写代价更低
B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了
12.5.4.查询效率更加稳定
于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当
13.sql
13.1.select * from 数据表 WHERE 重复记录字段 in ( select 重复记录字段 from 数据表 group by 重复记录字段 having count(重复记录字段)>1)