【数据库】MySQL必备知识

MySQL

数据库基础

数据库的优势

数据保存在内存:

优点:存取速度快

缺点:数据不能永久保存

数据保存在文件:

优点:数据永久保存

缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便

数据保存在数据库:

  1. 数据永久保存
  2. 使用SQL语句,查询方便效率高。
  3. 管理数据方便

三大范式

  • 第一范式:每个列都不可以再拆分。
  • 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
  • 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由,比如性能。事实上我们经常会为了性能而妥协数据库的设计。

MySQL的权限表

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。

  1. user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

  2. db权限表:记录各个帐号在各个数据库上的操作权限。

  3. table_priv权限表:记录数据表级的操作权限。

  4. columns_priv权限表:记录数据列级的操作权限。

  5. host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

数据类型

1、整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。

长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。

例子,假定类型设定为INT(5),属性为UNSIGNED ZEROFILL,如果用户插入的数据为12的话,那么数据库实际存储数据为00012。

2、实数类型,包括FLOAT、DOUBLE、DECIMAL。

  • DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数。
  • 而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算。

计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理。

3、字符串类型,包括VARCHAR、CHAR、TEXT、BLOB

  • VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
  • VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
  • VARCHAR存储的内容超出设置的长度时,内容会被截断
  • CHAR是定长的,根据定义的字符串长度分配足够的空间。
  • CHAR会根据需要使用空格进行填充,方便比较。
  • CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
  • CHAR存储的内容超出设置的长度时,内容同样会被截断。

使用策略:

  • 对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。
  • 对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。
  • 使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。
  • 尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。

4、枚举类型(ENUM),把不重复的数据存储为一个预定义的集合。

  • 有时可以使用ENUM代替常用的字符串类型。
  • ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。
  • ENUM在内部存储时,其实存的是整数。
  • 尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。
  • 排序是按照内部存储的整数

5、日期和时间类型,尽量使用timestamp,空间效率高于datetime,

  • 用整数保存时间戳通常不方便处理。
  • 如果需要存储微秒,可以使用bigint存储。

存储引擎

存储引擎:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。常用的存储引擎有以下:

MyISAM与InnoDB

  • Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
  • MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
  • MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
区别
  1. InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引
  2. InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
  3. MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
  4. InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
InnoDB引擎的4大特性
  1. 插入缓冲(insert buffer)
  2. 二次写(double write)
  3. 自适应哈希索引(ahi)
  4. 预读(read ahead)
存储引擎选择

如果没有特别的需求,使用默认的Innodb即可。

  • MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。
  • Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。

视图

视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。

视图具有如下好处:

  • 简化复杂的 SQL 操作,比如复杂的连接;
  • 只使用实际表的一部分数据;
  • 通过只给用户访问视图的权限,保证数据的安全性;
  • 更改数据格式和表示。

索引

简介

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

  1. 把创建了索引的列的内容进行排序
  2. 对排序结果生成倒排表
  3. 在倒排表内容上拼上数据地址链
  4. 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

优缺点

索引的优点:

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点:

时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;

空间方面:索引需要占物理空间。

索引覆盖

如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描),这叫索引覆盖。

因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率

这里值得注意的是不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小。

索引类型

  • 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。

  • 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。

    可以通过 ALTER TABLE table_name ADD UNIQUE (column);创建唯一索引

    可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2);创建唯一组合索引

  • 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。

    可以通过ALTER TABLE table_name ADD INDEX index_name (column); 创建普通索引

    可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, colum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值