MySQL的介绍
1、关系型数据库(微软的sqlserver【收费】,甲骨文的oracle【收费】)SQLite(是进程内的数据库,即不同进程写不同的SQLite,只能访问本进程的DB数据,不涉及开server这个操作)
(行式数据库)
非关系型数据库:键值对存储的,比如说:NoSQL(不支持SQL的数据库,key-val存储的,键值对存储的,而关系型数据库是二维表存储的,有行有列),redis,leveldb,rocksdb,mongodb(都是存储key-value)
还有大数据分析的列式数据库Hbase)
ceph:开源的分布式db数据库(C/C++写的)
2、MySQL目前属于Oracle,大家熟悉的关系型数据库还有SQLServer,Oracle,MySQL,MariaDB(原来的MySQL作者重写的开源的,因为MySQL现在归属于甲骨文,防止甲骨文对社区版收费,原作者不忍心,就重写了MariaDB),DB2(专门给金融行业,取款机,证券公司,安全做的很好!)
3、MySQL分为企业版和社区版,其中社区版是完全免费并且开源的,因为是开源的,所以安全,日志,引擎效率,性能监控方面的功能做的不够全面。
4、MySQL区别于其他关系型数据库很大的一个特定就是支持插件式的存储引擎,支持如lnnoDB,MylSAM,Memory等
5、目前google,腾讯,淘宝,百度,新浪,Facebook等公司都在使用MySQL作为数据存储层方案,rename重新命名,得到自己的数据库
6、MySQL,SQLserver,oracle都设计成C/S模型 mysql-server,mysql-client(多个进程请求同一个mysql-server)
7、MySQL的服务器模型采用的是I/O复用+可伸缩的线程池,是实现网络服务器的经典模型
MySQL使用的是select+线程池,为什么不用epoll???
(因为它在数据操作不仅仅是在内存,还涉及到磁盘I/O!磁盘I/O慢啊,所以网络I/O接收请求特别快,但是在实际数据操作,因为涉及磁盘I/O导致DB层处理非常慢,所以没有必要去用epoll,两个速度可以匹配上就可以了,磁盘I/O是支持数据持久化的DB层数据库绕不开的问题)
linux新版本的 uring(纯异步的网络IO编程接口,性能比epoll高了24%)
MySQL的数据类型
因为我们的业务层一般都是在内存上工作,效率速度是非常快的,一般达到性能瓶颈的是数据库,因为涉及磁盘I/O操作,是要慢很多的。
mysql-server运行在内存上,但是如果它要读取数据或者是读取索引的时候,就得花费磁盘I/O,从磁盘上读取数据或者索引。
MySQL数据类型定义了数据的大小范围,因此使用时选择合适的类型,不仅会降低表占用的磁盘空间,间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。
因为读取数据或者索引是要花费磁盘I/O的!
数值类型
我们要根据场景选择合适的类型!比如说:
TINYIN写成大小写都可以
这样的话,年龄的取值范围就是0-255
如果选择过大的话,就造成容量大,造成读取的索引文件大,造成磁盘I/O次数多,性能就降低了!!!
浮点类型推荐使用decimal类型(保存为字符串格式)(精确的金融计算,精度是28位,底层是字符串的形式存储,浮点数运算时如果数据越界溢出,是会报错的,给应用提醒!
但是如果是float和double的话,数据越界是不会报错的,直接进行数据溢出截断,四舍五入。)
age INT(4)
注意:整型占用内存的大小是固定的,是和具体的类型是强相关的,括号里的4只是代表整数显示的宽度!!!
字符串类型
CHAR(12) //占的宽度是12字符,表示字符数,字节数,超过12就会截断
VARCHAR(12)
括号也是表示显示的宽度。但是VARCHAR的长度是可变的,根据存储的内容是适配的,节省空间。但是超过12,数据就产生截断了
BLOB存储二进制文件(存储图片,小的音频数据)
文本存储是TEXT(留言板,商品的备注说明,聊天信息的存储,我们要注意数据的范围,进行限制住,防止数据插入失败,被截断)
注意:我们的字符串都是单引号括起来的哦!
日期和时间类型
日期类型也是做项目过程中,经常使用的类型信息,尤其是TIMESTAMP和DATETIME两个类型,但是注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新。
实际上,我们不会用到MySQL相应的操作的,因为在后台服务中,mysql是最快到达瓶颈的,因为涉及磁盘I/O,我们要尽量让mysql做最少的事情,去做核心的事情:CRUD,其他核心的过程是在业务中去做。
我们经常用到时间戳:整型存储就可以了,显示的是1970年开始的秒数
代表秒数。我们把时间戳转一下:
enum和set
这两个类型,都是限制该字段只能取固定的值,但是枚举字段enum只能取集合中的一个唯一的值,而集合set字段可以取集合中的任意多个值。
enum给业务限制了只能取固定的值,例如性别。如果给其他的值就报错。
MySQL运算符
算数运算符
示例:
逻辑运算符
示例:
比较运算符
示例:
通配符:
%表示可以匹配多个字符,_表示只匹配1个字符。
MySQL常用函数
字符串函数
数值函数
时间和日期函数
NOW():返回当前的日期和时间
UNIX_TIMESTAMP(data):返回日期date的UNIX时间戳
CURRENT_TIMESTAMP、CURRENT_TIMESTAMP() :当前时间
CURDATE():当前日期
CURTIME():当前时间
DATE_FORMAT(date, "%y-%m-%d"):格式化日期时间等
聚合函数
count、sum、avg、max、min
MySQL完整性约束
主键约束(能够唯一区分出来,不能取空值,不能重复,一个表一个主键)
primary key
自增键约束(针对于主键,例如对于前面定义的类型id,是自增的,例如1,23,4—,系统自动按顺序自增下去)
auto_increment
唯一键约束(可以取空值,而且一个表可以有多个唯一键,但是不能重复)
unique
非空约束
not null
默认值约束(给个默认值)
default
外键约束
foreign key
外键约束的例子:
这两张表是有关联的,在考试信息表中,有张三的id号,还有张三的考试成绩,但是如果要看张三的详细信息,则要访问学生信息表。假如现在张三退学了,从学生信息表中删除他的信息,就造成1个问题:学生信息表没有张三这个人,但是在考试信息表还存在张三的信息,是属于没用的信息了。所以呢,我们称学生信息表为父表,考试信息表为子表,子表的id号是主键,关联到了学生信息表的记录,我们从学生信息表删除张三时,系统得要有提示,然后要从其他表也删除关联到张三的信息。
在学生信息表中定义id号为外键。
我们让mysql只做增删改查,其他的由我们的业务层去做。
示例:
我们把id作为主键。系统自增id。