mySQL数据库

1、存储引擎
InnoDB与MyISAM略
2、数据类型
主要包括以下五大类:
整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮点数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期类型:Date、DateTime、TimeStamp、Time、Year
其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等
整型:
在这里插入图片描述
浮点型(float和double)
在这里插入图片描述
定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
字符串(char,varchar,_text)
在这里插入图片描述
二进制数据(_Blob)
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
日期时间类型
在这里插入图片描述
3、索引
按存储结构划分:FULLTEXT,HASH,BTREE,RTREE
按使用功能划分:普通索引(INDEX),唯一索引(UNIQUE INDEX),主键索引(PRIMARY KEY),全文索引(FULLTEXT INDEX),外键索引(FOREIGN KEY),组合索引。
(1) 主键索引 PRIMARY KEY
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
(2) 唯一索引 UNIQUE
唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD UNIQUE (column)
(3) 普通索引 INDEX
这是最基本的索引,它没有任何限制。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD INDEX index_name (column)
(4) 组合索引 INDEX
组合索引,即一个索引包含多个列。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)
(5) 全文索引 FULLTEXT
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
MyISAM的主索引和辅助索引采用的均是非聚集索引。
InnoDB的主索引和辅助索引均采用聚集索引。InnoDB辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录,从而能够明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
InnoDB,在实际项目接触是非常多的,索引的实现也是使用B+树,但是实现原理跟MyISAM不同。
InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。如下图:
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
在这里插入图片描述
在这里插入图片描述
4、事务
ACID
在这里插入图片描述
原子性,是redo log记录了事务期间操作的物理日志,事务提交之前,并没有写入磁盘,保存在内存里,如果事务失败,数据库磁盘不会有影响,回滚掉事务内存部分即可。
持久性,redo log 会在事务提交时将日志存储到磁盘redo log file,保证日志的持久性。
undo log实现了事务的一致性,可以通过undo log恢复到事务之前的逻辑状态,保证一致性。
一、重做日志(redo log)作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
二、回滚日志(undo log)作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。
READ-UNCOMMITTED 中文叫未提交读,即一个事务读到了另一个未提交事务修改过的数据
READ COMMITTED 中文叫已提交读,或者叫不可重复读。即一个事务能读到另一个已经提交事务修改后的数据,如果其他事务均对该数据进行修改并提交,该事务也能查询到最新值。
REPEATABLE READ 中文叫可重复读,即事务能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,即使后面其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。
SERIALIZABLE 叫串行化, 上面三种隔离级别可以进行 读-读 或者 读-写、写-读三种并发操作,而SERIALIZABLE不允许读-写,写-读的并发操作。
5、数据库优化
在这里插入图片描述
mySQl查询过程
1、创建索引
2、使用查询缓存
3、使用EXPLAIN关键字:使用 EXPLAIN 关键字可以知道MySQL是如何处理SQL语句的。这可以帮助分析查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉索引主键被如何利用的,数据表是如何被搜索和排序的等等。
4、 避免 SELECT :尽量使用更精确的结果
5、使用连接(JOIN)来代替子查询(Sub-Queries)
6、使用联合(UNION)来代替手动创建的临时表
6、锁
行锁 和 表锁
共享锁(S Lock) 和 排他锁(X Lock)
7、其他
三级模式两层影像:外模式/用户模式----->模式/逻辑模式----->内模式/存储模式,模式改变时只需要改变模式到外模式的映射就行,可以保证数据的逻辑独立性和物理独立性。
关系完整性:实体完整性:主键不能为空;参照完整性:外键要么为空,要么为引用表主键的一个值;用户自定义完整性:用户输入的值是否合法
count(
)算空值,其他聚集函数都跳过空值,聚集函数只能用于select语句和having语句中
查询选修了3门以上课程的学生学号:
select Sno from SC Group by Sno having count(*)>3;
创建索引:
create index Snoindex on student(Sno ASC,Cno DESC);

any:大于子查询结果中的某个值
all:大于子查询结果中的所有值

查询非计算机科学系中计算机科学系任意一个学生年龄小的学生姓名和年龄:
select age,name
from student
where dept!=‘CS’ and age<any(select age from student where dept=‘CS’);
也可以写成:
select age,name from student where dept!=‘CS’ and age<(select MAX(age) from student where dept=‘CS’)

查询没有选修1号课程的学生姓名:
select Sname from student where not exists(select Sname from SC,student where SC.Sno=student.Sno and Cno=‘1’);
查询选修了全部课程的学生姓名:
select Sname from student
where Sno IN
(select Sno from SC
group by Sno //根据Sno分组,统计每个学生选修了几门课程。如果等于course的总数,就是我们要找的Sno
having count() = (select count() from course )) //统计course中共有几门课程
或者:
select Sname from student
where NOT exists //
(select * from course
where NOT exists //不存在的提交给course
(select * from SC where
Sno = student.sno and cno = Course.Cno)) // 代入两个未知变量
insert into student(…) values(…);
修改某一个值:
update student set Sage=22 where Sno=‘201215121’;
n:m关系:
学生(学号,姓名,年龄,性别)
课程(课程号,课程名,学时数)
选修(学号,课程号,成绩)(学号和课程号共同作为主键)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值