mysql数据库简单了解
基本操作
数据库
-
创建数据库
create database 数据库名
表
-
创建表
CREATE TABLE 表名(...) -
修改表
alter table 表名 -
删除表
DROP TABLE 表名
数据
-
新增
单行插入数据 INSERT INTO 表名(col1, col2) VALUES(val1, val2) 插入查询出来的数据 INSERT INTO 新表名(col1, col2)SELECT col1, col2 FROM 表名 将一个表的内容插入到一个新表 oCREATE TABLE 新表名 ASSELECT * FROM 表名 -
修改
UPDATE 表名 SET 列名 = 值 WHERE xx = 1 -
删除
DELETE FROM 表名 WHERE id = 1 -
查询表
SELECT * FROM 表名 -
清空表
TRUNCATE TABLE 表名
字符集
在MySQL 8.0版本之前,MySQL 5.7 默认的客户端和服务器都用了 latin1,从MySQL 8.0开始,数据库的默认编码将改为 utf8mb4
常用命令
-
查看MySQL数据库所支持的字符集
show character set\G; -
查看MySQL数据库中关于字符集的相关设置
show variables like 'character%';说明: character_set_server 服务器级别的字符集 character_set_database 当前数据库的字符集 character_set_client 服务器解码请求时使用的字符集 character_set_connection 服务器处理请求时会把请求字符串从character_set_client转为 character_set_connection character_set_results 服务器向客户端返回数据时使用的字符集 -
修改已创建数据库的字符集
alter database 数据库名 character set 'utf8mb4'; -
修改已创建数据表的字符集
alter table 表名 convert to character set 'utf8';
权限
-
创建用户
CREATE USER 用户名 IDENTIFIED BY '密码'; -
修改用户名
RENAME 旧用户名 TO 新用户名; -
删除用户
DROP USER 用户名; -
查看用户权限
SHOW GRANTS FOR 用户名; -
授予用户权限
GRANT SELECT, INSERT ON 数据库名.表名 TO 用户名; GRANT SELECT, INSERT ON 数据库名.* TO 用户名; -
删除用户权限
REVOKE SELECT, INSERT ON 数据库.* FROM 用户名; -
更改用户密码
SET PASSWROD FOR myuser = Password('新密码');
存储引擎
常用存储引擎
InnoDB存储引擎
- MySql 5.6 版本默认的存储引擎
- 是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎
- 实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读
- 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升
- 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等
- 支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取
- InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能
MyISAM存储引擎
- 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它
- 提供了大量的特性,包括压缩表、空间数据索引等
- 不支持事务
- 不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)
- 可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的
- 如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,只会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会刷入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作
MEMORY存储引擎
- 在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失
InnoDB引擎和MyISAM引擎对比
- 事务: InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句
- 并发: MyISAM 只支持表级锁,而 InnoDB 还支持行级锁
- 外键: InnoDB 支持外键
- 备份: InnoDB 支持在线热备份
- 崩溃恢复: MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢
- 其它特性: MyISAM 支持压缩表和空间数据索引
查看数据库支持的引擎
SHOW ENGINES;
数据类型
整型
- TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间,一般情况下越小的列越好
- INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说是没有意义的
浮点数
- FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。FLOAT、DOUBLE 和 DECIMAL 都可以指定列宽,例如 DECIMAL(18, 9) 表示总共 18 位,取 9 位存储小数部分,剩下 9 位存储整数部分
字符串
- 主要有 CHAR 和 VARCHAR 两种类型,一种是定长的,一种是变长的
- VARCHAR 这种变长类型能够节省空间,因为只需要存储必要的内容。但是在执行 UPDATE 时可能会使行变得比原来长,当超出一个页所能容纳的大小时,就要执行额外的操作。MyISAM 会将行拆成不同的片段存储,而 InnoDB 则需要分裂页来使行放进页内
- VARCHAR 会保留字符串末尾的空格,而 CHAR 会删除
时间和日期
- MySQL 提供了两种相似的日期时间类型: DATETIME 和 TIMESTAMP
- DATETIME能够保存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。它与时区无关
- TIMESTAMP和 UNIX 时间戳相同,保存从 1970 年 1 月 1 日午夜(格林威治时间)以来的秒数,使用 4 个字节,只能表示从 1970 年 到 2038 年。它和时区有关,也就是说一个时间戳在不同的时区所代表的具体时间是不同的。默认情况下,如果插入时没有指定 TIMESTAMP 列的值,会将这个值设置为当前时间。应该尽量使用 TIMESTAMP,因为它比 DATETIME 空间效率更高
BLOB 和 TEXT
- BLOB和TEXT都是为存储很大的数据而设计的数据类型,分别采用二进制和字符方式存储
- 与其他类型不同,MySQL把每个BLOB和TEXT值当做一个独立的对象去处理。当BLOB和TEXT值太大时,InnoDB会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值
其它
数据类型优化思路
- 更小的通常更好,更小的数据类型通常更快。因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少
- 简单就好;例如,整形比字符串操作代价更低;实用内建类型而不是字符串来存储日期和时间;用整形存储IP地址等
- 尽量避免NULL;如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL 的列使得索引、索引统计和值比较都更复杂。尽管把可为NULL的列改为NOT NULL带来的性能提升比较小,但如果计划在列上创建索引,就应该尽量避免设计成可为NULL的列
选择表示符(identifier)
- 整数类型通常是标识列的最佳选择。如果可能,应该避免使用字符串类型作为标识列,因为它们很耗空间,并且比数字类型慢
- 对于完全随机的字符串也需要多加注意,这些函数生成的新值会任意分布在很大的空间内,这会导致INSERT以及一些SELECT语句变得很慢
函数
统计处理
- AVG(返回某列的平均值)
- COUNT(返回某列的行数)
- MAX(返回某列的最大值)
- MIN(返回某列的最小值)
- SUM(返回某列值之和)
文本处理
- LEFT(左边的字符)
- RIGHT(右边的字符)
- LOWER(转换为小写字符)
- UPPER(转换为大写字符)
- LTRIM(去除左边的空格)
- RTRIM(去除右边的空格)
- LENGTH(长度)
- SOUNDEX(转换为语音值)
时间处理
- AddDate。增加一个日期(天、周等)
- AddTime。增加一个时间(时、分等)
- CurDate。返回当前日期
- CurTime。返回当前时间
- Date。返回日期时间的日期部分
- DateDiff。计算两个日期之差
- Date_Add。高度灵活的日期运算函数
- Date_Format。返回一个格式化的日期或时间串
- Day。返回一个日期的天数部分
- DayOfWeek。对于一个日期,返回对应的星期几
- Hour。返回一个时间的小时部分
- Minute。返回一个时间的分钟部分
- Month。返回一个日期的月份部分
- Now。返回当前日期和时间
- Second。返回一个时间的秒部分
- Time。返回一个日期时间的时间部分
- Year。返回一个日期的年份部分
数值处理
- SIN。正弦
- COS。余弦
- TAN。正切
- ABS。绝对值
- SQRT。平方根
- MOD。余数