磁盘文件–> 层次模型 –> 网状模型 –> (Codd) 关系模型
主键(Primary key):用于惟一确定一个记录的字段;复合主键:多个字段组合成一个主键(NOT NULL);
惟一键:一个或多个字段的组合,填入的数据必须能在本表 中唯一标识本行;允许为NULL,但只能有一个null。
约束:
三层模型:
事务: 多个操作被当作一个整体对待 ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
三范式:设计关系数据库时,遵从不同的规范要求,设计出合理的 关系型数据库,这些不同的规范要求被称为不同的范式,各种范 式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第 四范式(4NF)和第五范式(5NF,又称完美范式)。满足最 低要求的范式是第一范式(1NF)。在第一范式的基础上进 一步满足更多规范要求的称为第二范式(2NF),其余范式 以次类推。一般说来,数据库只需满足第三范式(3NF)即可。
范式:第一范式、第二范式、第三范式;
三范式详解:https://www.zhihu.com/question/24696366
注意,唯一索引列的值可以为null,但是只能有一个null。
show variables like ‘%slow%’;
show variables like “%quer%”;
查看当前数据库中表使用的存储引擎:SHOW TABLE STATUS;
查看MqSql所有的存储引擎:SHOW ENGINES; 可以看到support中有一个default表示当前默认使用的引擎。
查看InnoDB存储引擎的状态信息:SHOW ENGINE innodb STATUS;
查看用户授权:查看授权: SHOW GRANTS [FOR ‘user’@’host’]
innodb 的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用
myisam 中, 主索引和次索引,都指向物理行(磁盘位置).称为堆组织表。
innodb:
高性能索引策略:对于innodb而言,因为节点下有数据文件,因此节点的分裂将会比较慢. 对于innodb的主键,尽量用整型,而且是递增的整型. 如果是无规律的数据,将会产生的页的分裂,影响速度.
聚簇索引
优势: 根据主键查询条目比较少时,不用回行(数据就在主键节点下)
劣势: 如果碰到不规则数据插入时,造成频繁的页分裂.
为了数据的一致性,使用事务。多个事务一起执行就会引发事务的隔离性的问题。要解决事务的隔离性问题就需要使用锁。
事务:一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工作单元。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
查看事务类型:SELECT @@autocommit; //1为自动提交,0为手动提交
修改为手动提交:SET autocommit = 0;
启动:START TRANSACTION
执行sql语句
提交:COMMIT 或 回滚:ROLLBACK
事务是好的,但是事务又会带来其他问题,比如:脏读、不可重复读和幻影读等问题。
查看数据库的默认隔离级别:SELECT @@session.tx_isolation;//默认为REPEATABLE-READ
针对以上可能的问题,InnoDB提供了四种不同级别的机制保证数据隔离性。
事务的隔离用是通过锁机制实现的,不同于MyISAM使用表级别的锁,InnoDB采用更细粒度的行级别锁,提高了数据表的性能。InnoDB的锁通过锁定索引来实现,如果查询条件中有主键则锁定主键,如果有索引则先锁定对应索引然后再锁定对应的主键(可能造成死锁),如果连索引都没有则会锁定整个数据表。
需要解决事务的隔离性的问题,就需要使用到锁。
查看mysql锁状态 show status like ‘%lock%’;//关键看Innodb_row_lock_current_waits有多少在等待
在select后面加上LOCK IN SHARE MODE会在读取的行上加共享锁,其他session只能读不能修改或删除,如果有其他事务修改了记录,那么会等待事务提交后,再读取。
即在符合条件的rows上都加了共享锁,这样的话,其他人可以读取这些记录,也可以继续添加共享锁,但是无法修改这些记录直到你这个加锁的过程执行完成(完成的情况有:事务的提交,事务的回滚,否则直接锁等待超时)。
测试用例
//打开一个mysql链接:session1
SET autocommit = 0; //这里只是修改session1的事务提交改为手动提交,session2还是会自动提交。
begin ;
select * from class_info where id=2 LOCK IN SHARE MODE;
//commit;
//begin; //这里尝试多次对where id=2的行数据加锁。
//select * from class_info where id=2 LOCK IN SHARE MODE;
//
//再打开一个session2
update class_info set class_name='111' where id=2;
解说:id=2这条数据在session1中加了共享锁,这个时候所有事物只能读而不能写。
session2去修改了2这条数据,这个时候修改会处于等待中,等待过程中如果session1中的没有提交或者回滚,则session2中的update就会报lock请求超时。如果session2中修改的是where id=3则不会被锁住,说明lock in share mode锁的是行级别的。
上面对where id=2加了两次锁,只需要某一次的事务执行了提交,则该锁释放,说明共享锁不管加几次他们都是同一把锁,且只需要一次提交即可解锁。
排他锁:表示对数据进行写操作,如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了,
在select后面加上 FOR UPDATE 在读取行上设置一个排他锁,阻止其他session读取或者写入行数据。
对于update,insert,delete语句MySql会自动加排它锁.
表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。
MVCC:多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。
InnoDB实现MVCC的方法是,它存储了每一行的三个(1)额外的隐藏字段,这三个隐藏字段分别记录了行的创建的时间和删除的时间。在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。依照事物的 版本来检查每行的版本号。在事物隔离级别为可重复读的情况下,来看看怎样应用它。
SELECT的情况下确保他们符合两个标准:
INSERT的情况下:InnoDB为每个新增行记录当前系统版本号作为创建ID。
注:隐藏的三个字段为:
索引:提取索引的创建在的表上字段中的数据,构建出一个独特的数据结构;
索引的作用:加速查询操作;副作用:降低写操作性能;
索引类型:B+ TREE,HASH,B- TREE
B+ TREE:顺序存储,每一个叶子结点到根结点的距离相同;左前缀索引,适合于范围类型的数据查询;
在MySQL中,InnoDB引擎表是(聚集)索引组织表(clustered index organize table),而MyISAM引擎表则是堆组织表(heap organize table)
聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序;
而非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。
聚集索引表里数据物理存储顺序和主键索引的顺序一致,所以如果新增数据是离散的,会导致数据块趋于离散,而不是趋于顺序。
而非聚集索表数据写入的顺序是按写入时间顺序存储的。
聚集索引表相比堆组织表的优势是:
范围查询效率更高;
数据频繁更新(聚集索引本身不更新)时,更不容易产生碎片;
特别适合有一小部分热点数据频繁读写的场景;
通过主键访问数据时快速可达;
ALTER TABLE index_demo ADD INDEX(name,head_url,address);
#走索引
explain select * from index_demo where name='111' and head_url>'22' and address='222';
#走索引
explain select * from index_demo where name='111' and address='222';
#走索引
explain select * from index_demo where name='111' and head_url>'22';
#全表扫描,使用覆盖索引type=index,using index
explain select * from index_demo where head_url>'22';
#全表扫描,使用覆盖索引type=index,using index
explain select * from index_demo where address='222';
#全表扫描,使用覆盖索引type=index,using index
explain select * from index_demo where head_url>'22' and address='222';
如果查询条件不是从最左侧列开始,索引无效;
index(age,Fname)
WHERE Fname=’Jerry’;//走索引,老版本不走索引,但是新版本innodb是走索引的。
WHERE age=30;//走索引
WHERE age>30 AND Fname=’Smith’; //走索引
不能跳过索引中的某列;
index(name,age,gender)
WHERE name=’black’ and age > 30;//走索引
WHERE name=’black’ AND gender=’F’;//不走索引
如果查询中的某个列是为范围查询,那么其右侧的列都无法再使用索引优化查询;WHERE age>30 AND name=’Smith’;(估计是老版本不走索引,但是新版本亲测会走索引,所以还是需要亲自上手测试一下)
Hash索引:基于哈希表实现,特别适用于值的精确匹配查询;
高性能索引策略:
explain来分析索引有效性:
EXPLAIN SELECT select_options
输出结果:
1.导出整个数据库
mysqldump -u 用户名 -p –default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入数据库
A:常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source wcnc_db.sql
B:使用mysqldump命令
mysqldump -u username -p dbname < filename.sql
C:使用mysql命令
mysql -u username -p -D dbname < filename.sql
http://blog.csdn.net/timchen525/article/details/75268151 慢查询日志开启
https://www.cnblogs.com/phpper/p/6937650.htmlMVCC