MYSQL使用B+树:
哈希:无序,不支持连续区域查找和动态扩展存储内存
平衡二叉树:
存B+:存储特质决定,避免频繁操作
一 数据库的基本概念
1,数据库(DataBase DB):长期保存在计算机的存储设备上,按照一定的规则组织起来,可以被各种用户或应用共享的数据集合。
2,数据库管理系统(DataBase Management System,DBMS):是指一种操作和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统来访问数据库中的数据。
3,数据库系统(DBS):是指计算机系统中引入数据库后的系统,通常由计算机硬件,软件,数据库管理系统和数据管理员组成。
二 数据库的基本操作
1,创建数据库
create Database databasetest;
2,选择数据库
use databasetest;
3,删除数据库
drop Database databasetest;
4,显示数据库
show Databases;
三存储引擎和数据类型
1,查看存储引擎
show engines \G
2,查看默认存储引擎
show variables like 'storage_engine%';
3,存储引擎特性
聚簇索引:innodb:数据和文件在一个地方,以主键id为键,叶子节点直接存储数据记录
非聚簇索引:myisam:最后一层是叶子节点(物理地址),再通过地址查找响应数据
MyISAM
它不支持事务,也不支持外键,尤其是访问速度快,因此对事务完整性没有要求或者以访问(SELECT、INSERT)为主的应用都可以使用这个引擎来创建表。
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。对事务完整性要求高,需要实现并发控制,适合使用该存储。
1)自动增长列:
InnoDB表的自动增长列可以手工插入,但是插入的如果是空或0,则实际插入到则是自动增长后到值。可以通过"ALTER TABLE...AUTO_INCREMENT=n;"语句强制设置自动增长值的起始值,默认为1,但是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入多条记录,那么返回的是第一条记录使用的自动增长值。
对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。
2)外键约束:
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
MEMORY
memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
四,数据类型:整数类型,浮点型,定点数,位类型,日期和时间,字符串
1整数类型
整数类型 | 字节 | 值 |
TINYINT | 1 | 0-2^8-1 |
SMALLINT | 2 | 0-2^16-1 |
MEDIUMINT | 3 | 0-2^24-1 |
INT / INTEGER | 4 | 0-2^32-1 |
BIGINT | 8 | 0-2^64-1 |
2浮点型
浮点型类型 | 字节 | 值 |
float | 4 | 1.75E-38------3.40E+38 |
double | 8 | 2.22E-308----1.79E+308 |
3定点数类型
定点数 | 字节 | 值 |
DEC(M,D) / DECIMAL(M,D) | M+2 | 与double相同 |
4位类型
位类型 | 字节 | 值 |
BIT(M) | 1-8 | BIT(1)-BIT(64) |
5日期和时间
日期和时间类型 | 字节 | 最小值 | 最大值 |
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMPT | 4 | 19700101080001 | 2038年的某个时刻 |
TIME | 3 | -835:59:59 | 835:59:59 |
YEAR | 1 | 1901 | 2155 |
create table d_test(f_date DATE,f_datetime DATETIME,f_timestamp TIMESTAMP,f_time TIME,f_year YEAR);
insert into d_test values(cuedate(),now(),now(),time(now()),year(now()));
select * from d_test \G
6,字符串类型
char系列字符串类型 | 字节 | 描述 |
char(M) | M | M位0-255之间的整数 |
varchar(M) | M | M位0-65535之间的整数 |
7,text系列字符串类型
text系列字符串类型 | 字节 | 描述 |
tinytext | 0-255 | 值的长度为+2字节 |
text | 0-65535 | 值的长度为+2字节 |
mediumtext | 0-2^24 | 值的长度为+3字节 |
longtext | 0-2^32 | 值的长度为+4字节 |
8,binary系列字符串类型
binary系列字符串类型 | 字节 | 描述 |
binary(M) | M | 允许长度为0-M |
varbinary(M) | M | 允许长度为0-M |
9,blob系列字符串类型
blob系列字符串类型 | 字节 |
tinyblob | 0-255 |
blob | 0-2^16 |
mediumblob | 0-2^24 |
longblob | 0-2^32 |
create table user(id int,name varchar(20));
insert into user values((1,'bob'),(2,'petter'),(3,'a345678454267123456789'));
show warnings;
select * from user;
id name
1 bob
2 petter
3 a3456784542671234567