MySQL数据库
- MySQL数据类型
- SQL 语法
- 约束:
- 主键约束 PRIMARY KEY
- 唯一约束 UNIQUE KEY
- 默认约束 DEFAULT
- 外键约束
- 数据表的修改
- 添加列
- 添加约束
- 删除约束
- 修改 列 & 表
- 数据库的增删改查
- 插入记录
- 更新记录
- 删除记录
- 查找记录
- 查询表达式
- 对查询结果分组
- 对查询结果排序
- 限制查询结果返回的数量 LIMIT
- 将一个表的记录插入另一个表
- 子查询与连接
- 子查询
- 使用比较运算符的子查询
- 使用[NOT] IN的子查询
- 使用[NOT] EXISTS的子查询
- 使用 INSERT 的自查询
- 多表更新
- 多表更新一步到位
- 连接关系
- 多表连接
- 自身连接
- 多表删除
- 运算符和函数
- 字符函数
- LIKE 模糊查询
- 数值函数
- 比较函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- 自定义函数
- MySQL存储过程
- 创建存储过程
- 存储过程与自定义函数的区别
- 存储引擎
- MySQL支持的存储引擎
- 相关知识点
MySQL数据类型
整数型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) 大整数值 | |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
浮点型&定点型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
日期&时间
类型 | 大小 | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038-01-19 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串
类型 | 大小 | 用途 |
CHAR | 0-255 | 定长字符串 |
VARCHAR | 0-65535 | 变长字符串 |
TINYBLOB | 0-255 | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255 | 短文本字符串 |
BLOB | 0-65535 | 二进制形式的长文本数据 |
TEXT | 0-65535 | 长文本数据 |
MEDIUMBLOB | 0-167777215 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-167777215 | 中等长度文本数据 |
LONGBLOG | 0-4294967295 | 二进制形式极大文本数据 |
LONGTEXT | 0-4294967295 | 极大文本数据 |
SQL 语法
行:记录
列:字段
/*创建数据库*/
CREATE DATABASE [ IF NOT EXISTS ] db_name (CHARACTER SET = charset_name);
/*修改数据库编码*/
ALTER DATABASE db_name CHARACTER SET = charset_name;
/*查看数据库相关信息*/
SHOW CREATE DATABASE db_name;
/*删除数据库*/
DROP DATABASE db_name;
/*查看所有数据库列表*/
SHOW DATABASES;
/*展示警告信息*/
SHOW WARNINGS;
/*打开数据库*/
USE db_name;
/*查看当前数据库*/
SELECT DATABASE();
/*创建数据表*/
CREATE TABLE [IF NOT EXISTS] tabel_name(
column_name data_type1 [NULL], //该字段可为空,默认
column_name data_type2 [ NOT NULL], //字段不能为空
···
);
/*查看数据表*/
SHOW TABLES FROM db_name;
/*查看数据表的结构*/
SHOW COLUMNS FROM tb_name;
/*插入记录*/
INSERT table_name [(col_name,···)] VALUES(val,···);
/*查找全部记录*/
SELECT * FROM table_name;
约束:
主键约束 PRIMARY KEY
- 每张数据表只能存在一个主键
- 主键保证记录的唯一性,不得存在相同的值
- 主键自动为NOT NULL
- 不一定与AUTO_INCREMENT同时使用
AUTO_INCREMENT
- 自动编号赋值,须与主键同时使用
- 仅限于整型,第一个为1
唯一约束 UNIQUE KEY
- 可保证记录的唯一性
- 每张数据表可存在多个唯一约束
- 唯一约束的字段可为NULL值
默认约束 DEFAULT
- 设置默认值
例:
CREATE TABLE tb(
id SMALLINT PRIMARY KEY,
name VARCHAR(10) UNIQUE,
sex ENUM('male','female') DEFAULT male
)
外键约束
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
- 数据表的存储引擎只能为InnoDB
- 外键列二和参照列必须具有相同的数据类型,其中数据的长度和符号位必须相同,字符长度可不同
- 外键列和参照列必须创建索引,如果外检不存在索引,MySQL将自动创建索引。
eg:
CREATE TABLE provinces (
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
)
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAT(10),
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces (id)
)
/*查看表是否有索引*/
SHOW INDEXS FROM table_name;
数据表的修改
添加列
ALTER TABLE table_name ADD column_name column_definition [FIRST / AFTER column_name];
/*在name列后面添加password列*/
ALTER TABLE users ADD password CARCHAR(16) NOT NULL AFTER name;
注释:添加多列时需要加括号,将每列隔开,且不能指定位置(默认加在最后)
添加约束
/*添加主键约束*/
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
/*添加唯一约束*/
ALTER TABLE table_name ADD UNIQUE KEY (column_name,...);
/*添加外键约束*/
ALTER TABEL table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (column_name) REFERENCES table_name2 (column_name2);
/*添加 or 删除默认约束*/
ALTER TABLE table_name ALTER column_name SET DEFAULT default_value;
ALTER TABLE table_name ALTER column_name DROP DEFAULT;
删除约束
/*删除主键约束*/
ALTER TABLE table_name DROP PRIMARY KEY;
/*删除唯一约束*/
ALTER TABLE table_name DROP KEY column_name;
/*删除外键约束*/
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;
/*可通过查看表信息得到外键约束名称 constraint:fk_symbol,默认tabname_ibfk_1;*/
/*删除外键残余的索引*/
ALTER TABLE table_name DROP INDEX index_name;
修改 列 & 表
/*修改列定义*/
ALTER TABLE table_name MODIFY column_name column_definition [FIRST / AFTER column_name2]
/*修改列名称*/
ALTER TABLE table_name CHANGE column_name new_column_name column_definition [FIRST / AFTER column_name2]
/*重命名表*/
ALTER TABLE table_name RENAME new_table_name;
RENAME TABLE table_name TO new_table_name [, table_name2 TO table_name2...];
数据库的增删改查
插入记录
INSERT table_name [(column_name1,...)] VALUES(value1,value2...),(...)...;
/*一次只能插入一条记录,可用子查询 SubQuery*/
INSERT table_name SET column_name1=value1,...;
/*此方法可将查询结果插入数据表中*/
INSERT table_name [(col_name1,...)] SELECT...;
注:若列为AUTO_INCREMENT,则值设为NULL或DEFAULT;
更新记录
UPDATE tab_reference SET col_name = expr / default [,col_name2=...] [WHERE where_condition]
e.g
UPDATE tab_reference SET age = age+10,sex=male;
UPDATE tab_reference SET age = id+age WHERE id%2=0;
删除记录
DELETE FROM tab_name WHERE where_condition; //若不添加条件,则删除全部记录
查找记录
查询表达式
- 每一个表达式表示查找的一列,且至少一个
- 多列之间以逗号分隔
- 星号(*)表示所有的列
- 查询表达式可以使用AS alias_name为其赋予别名
- 别名可用于GROUP BY, ORDRE BY或HAVING子句
一般格式
SELECT [ALL|DISTINCT] <目标列表表达式>
FROM <表或视图>|<SELECT 语句> [AS 别名]
[WHERE <条件表达式>]
[GROUP BY <列名1>] [HAVING <条件表达式>]
[ORDER BY <列名2> [ASC|DESC]]
eg:
SELECT id,name FROM users;
SELECT users.id,user.name FROM users;
SELECT id AS usersID FROM users;
对查询结果分组
/*按照某列队查询结果分组,或者按位置分组,ASC升序,DESC降序*/
SELECT col_name FROM tab_name GROUP BY col_name1/position [ASC/DESC];
/* 对分组进行选择, 相当与 where, 但 where 在 group 前 */
HAVING where_condition // 条件字段应该出现在查询列中或者条件式为聚合函数
eg:
SELECT sex,age FROM users GROUP BY 1 HAVING age>35;
SELECT sex,age FROM users GROUP BY 1 HAVING count(id)>10;
对查询结果排序
SELECT __ FROM __ ORDER BY col-name/expr/position [ASC/DESC];
SELECT * FROM users ORDER BY age,id DESC; //按照age-id降序
限制查询结果返回的数量 LIMIT
SELECT * FROM users LIMIT 3; //只显示前3条
SELECT * FROM users LIMIT 2,3; //只显示查询结果的第3~5条
注:mysql个数计数从0开始
将一个表的记录插入另一个表
INSERT tab_name (col_name1,...) SELECT (col_name_1,...) FROM tab_name2 WHERE ____ ;
/**/
INSERT users2 (name) SELECT username FROM users WHERE age>20;
子查询与连接
子查询
- 子查询是指嵌套在查询内部,切必须始终出现在圆括号内。
- 子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、SET、LIMIT、函数等。
- 子查询的外层查询可以是:SELECT、INSERT、UPDATA、SET或者DO。
- 子查询可以返回值:标量、一行、一列或者子查询。
使用比较运算符的子查询
运算符:=、>、<、>=、<=、<>、!=、<=>
语法结构: operand comparison_operator subquery
/*查询出高于平均价格的商品*/
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
//ROUND(X,2)x保留两位小数,AVG(x)对x求平均值。
关键字:ANY、SOME、ALL
- SOME、ANY:满足其中一个就行。
- ALL:必须满足全部。
/*查询到的商品价格大于超级本的最低价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
/*查询到的商品价格大于超级本的最高价*/
SELECT goods_name,goods_price FROM tdb_goods WHERE goods_price > ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
使用[NOT] IN的子查询
语法结构:operand comparison_operator [NOT] IN (subquery)
- =ANY 运算符与IN等效
- !=ALL或<>ALL云算法与NOT IN等效
使用[NOT] EXISTS的子查询
如果子查询返回结果,EXISTS将返回TRUE;否则返回FALSE
使用 INSERT 的自查询
将查询结果写入数据表
INSERT tbl_name [(col_name,…)] SELECT …
多表更新
UPDATE teble_references
SET col_name1=expr
WHERE where_condition;
其中多表关系table_references为
table_name1 连接类型 table_2 ON conditional_ecpr
连接类型
- 内连接:JOIN/CROSS JOIN/INNER JOIN等价
- 左外连接LEFT [OUTER] JOIN
- 右外连接RIGHT [OUTER] JOIN
例:
/*把表tdb_goods_cates中cate_name与tdb_goods中goods_cate相对应的部分,用cate_id代替goods_cate*/
UPDATE tdb_goods INNER JOIN tdb_goods_cate ON goods_cate=cate_name
SET goods_cate = cate_id;
多表更新一步到位
/*创建的同时将查询的记录插入到新表中*/
CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY AUTO_INCREMENT,
brand_name VARCHAR(30) NOT NULL
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
连接关系
- 内连接:仅表示符合条件的连接
- 左外连接: 表示全部左边条件的连接, 结果中右边不符合的对应为null,若定义为NOT NULL,则停止查找
- 右外连接: 同上
多表连接
SELECT tdb_goods_name,tdb_goods_cate,tdb_goods_price FROM tdb_goods AS g
INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
INNER JOIN tdb_goods_Brands AS b ON g.brand_id = b.brand_id;
自身连接
/*必须使用别名,得到的结果用名称代替 parent_id*/
SELECT s.type_id,type_name,p.type_name FROM tdb_goods_types AS s JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;
/**显示(直接)子类数量/
SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_id;
多表删除
DELETE tbl_name1[.* ] [,tbl_name.* ]…
FROM table_references
[ WHERE where_condition ]
/*复制记录*/
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
/*查找重复记录*/
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
/*删除一个表中重复的记录*/
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;
运算符和函数
字符函数
函数名称 | 描述 | 用法 |
CONCAT() | 字符连接 |
|
CONCAT_WS() | 使用指定的分隔符进行字符连接 | CONCAT_WS(‘分隔符’, , …) |
FORMAT() | 数字格式化 |
|
LOWER() | 转换成小写字母 |
|
UPPER() | 转换成大写字母 | |
LEFT() | 获取左侧字符 |
|
RIGHT() | 获取右侧字符 | |
LENGTH() | 获取字符长度 |
|
LTRIM() | 删除前导空格 |
|
RTRIM() | 删除后续空格 |
|
TRIM() | 删除前导和后续空格 |
|
SUBSTRING() | 字符串截取 |
|
[NOT] LIKE | 模式匹配 | %表示任意多个字符, _表示任意一个字符 |
REPLACE() | 字符串 |
|
TRIM 拓展
/*删除自定义前导字符*/
SELECT TRIM(LEADING '?' FROM '??MYS?QL?' ; /*结果为 MYS?QL?*/
/*删除自定义后续字符*/
SELECT TRIM(TRAILING '?' FROM '??MYS?QL?' ; /*结果为 ??MYS?QL*/
/*删除自定义前导和后续字符*/
SELECT TRIM(BOTH '?' FROM '??MYS?QL?' ; /*结果为 ??MYS?QL*/
LIKE 模糊查询
/*查找test中first_name字段包含字母o的记录*/
SELECT * FROM test WHERE first_name LIKE '%o%';
/*查找test中first_name字段包含%的记录*/
SELECT * FROM test WHERE first_name LIKE '%1%%' ESCAPE '1';
数值函数
函数名称 | 描述 | 用法 |
CEIL() | 进一取整 |
|
DIV | 整数除法 |
|
FLOOR() | 舍一取整 |
|
MOD | 取余数(取模) |
|
POWER() | 幂运算 |
|
ROUND() | 四舍五入 |
|
TRUNCATE() | 数字截取(不四舍五入) |
|
比较函数
函数名称 | 描述 | 用法 |
[NOT]BETWEEN x AND y | 是否在数字x与y之间 |
|
[NOT] IN() | 是否在列出值范围内 |
|
IS [NOT] NULL | 是否为空 |
|
日期时间函数
函数名称 | 描述 | 用法 |
NOW() | 当前日期和时间 | |
CURDATE() | 当前日期 | |
CURTIME() | 当前时间 | |
DATE_ADD() | 日期变化 |
|
DATEDIFF() | 日期差值 |
|
DATE_FORMAT() | 日期格式化 |
|
信息函数
函数名称 | 描述 | 用法 |
CONNECTION_ID() | 连接ID | |
DATABASE() | 当前数据库 | |
LAST_INSERT_ID() | 最后插入记录的ID号 | 当最后一次同时输入多个时,取第一个 |
USER() | 当前用户 | |
VERSION() | 版本信息 |
聚合函数
函数名称 | 描述 | 用法 |
AVG() | 平均值 |
|
COUNT() | 计数 |
|
MAX() | 最大值 |
|
MIN() | 最小值 | |
SUM() | 求和 |
|
加密函数
函数名称 | 描述 | 用法 |
MD5() | 信息摘要算法,一般用于web密码 |
|
PASSWORD() | 密码算法,可以改密码 |
|
自定义函数
创建自定义函数
CREATE FUNCTION function_name
RETURNS {STRING/ INTEGER/ REAL/ DECIMAL} routine_body
关于函数体
- 函数体由合法的SQL语法构成;
- 函数体可以是简单的SELECT或INSERT语句;
- 函数体如果为复合结构则使用BEGIN…END语句;
- 复合结构可以包括声明,循环,控制结构。
创建无参函数
CREATE FUNCTION f1() RETURNS VARCAHR(30)
RETURN DATE_FORMAT((NOW(),'%Y年%m月%d日 %H点%i分%s秒');
SELECT f1();
创建带参函数
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
复合结构的函数体
/* 需要同时执行多条语句,要把结束符号改掉,否则遇到';'就直接结束了 */
DELIMITER //
/*创建复合结构函数体,功能为在user表格中插入一条记录,并返回其id*/
CREATE FUNCTION ADD_USER(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(username) VALUES(username);
RETURN LAST_INSERT_ID();
END//
/*begin 和 end 中间执行多条语句*/
MySQL存储过程
存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理(类似函数)。存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户申明变量以及进行流程控制。存储过程可以接受输入类型的参数和输出类型的参数,并且可以存在多个返回值。只在第一次调用时进行语法分析和编译,以后的调用直接调用编译的结果,效率大大提高。
优点:
- 增强SQL语句的功能和灵活性:可以通过控制语句对流程进行控制和判断
- 实现较快的执行速度:客户端第一次调用存储过程时,MySQL引擎会对其进行语法分析、编译等操作,然后将编译结果存储到内存中,所以第一次和之前的效率一样,然而以后会直接调用内存中的编译结果,效率提高
- 减少网络流量:例如删除一个记录,我们原本要输入DELETE FROM xx WHERE …; 要传输的字符较多,如果写成存储过程,就只要调用存储过程的名字和相应参数就行,传输的字符数量较少,所以减少了网络流量。
创建存储过程
CREATE
[DEFINER = user / CURRENT_USER]
PROCEDURE sp_NAME([proc_parameter[,..])
[characteristic ...] routine_body
proc_parameter:
IN / OUT / INOUT param_name type
参数
- IN : 参数的值必须在调用时指定
- OUT : 参数的值可以被存储过程改变,并且可以返回
- INOUT : 调用时指定,并且可以被改变和返回
过程体
- 过程体有合法的sql语句构成
- 如为复合结构,则需要使用Benin with 语句
- 可以使用条件循环等控制语句
/*无参存储过程*/
CREATE PROCEDURE guocheng() SELECT VERSION();
/*调用*/
CALL guocheng();
/*有IN类型参数存储过程*/
CREATE PROCEDURE removeGoodsById(IN id INT UNSINGNED)
DELETE FROM tdb_goods WHERE goods_id = id;
CALL removeGoodsById(23);
/*带有IN和OUT类型参数, 删除传入id记录并返回剩余数量,*/
DELIMITER //
CREATE PROCEDURE removeByIdReturnNumber(IN id INT UNSIGNED, OUT nums UNSIGNED)
BEGIN
DELETE FROM tdb_goods WHERE goods_id = id;
SELECT COUNT(tdb_goods) FROM tdb_goods INTO nums;
END//
DELIMITER ;
CALL removeByIdReturnNumber(20, @num);
SELECT @num; /*输出结果*/
/*删除并返回删除的数量和剩余数量*/
DELIMITER //
CREATE PROCEDURE RemoveCateReturnInfo(IN id SMALLINT UNSIGNED, OUT delNum INT UNSIGNED, OUT remainNum INT UNSIGNED)
BEGIN
DELECT FROM tdb_name WHERE cate_id = id;
SELECT ROW_COUNT() INTO delNum;
SELECT COUNT(goods_id) fROM tdb_goodsINTO remainNum;
END //
DELIMITER ;
CALL removeCateReturnInfo(6,@del,@rem);
SELECT @del,@rem;
声明变量DECLARE @a INT;
只能在BEGIN…END中声明局部变量,且只能写在第一行SET @a = 7;
用户变量,(类似全局变量)
存储过程与自定义函数的区别
- 别存储过程实现的功能相对复杂,函数针对性较强
- 存储过程可以返回多个值,函数只能有一个返回值
- 存储过程一般独立执行,函数可以作为 sql 语句的组成部分来出现
存储引擎
定义: MySQL可以将数据以不同的技术存储在文件(内存)中。
MySQL支持的存储引擎
- MyISAM
- InnoDB
- Memory
- CSV
- Archive
相关知识点
- 并发控制 : 当多个连接对记录进行修改时保证数据的一致性和完整性
- 锁
- 共享锁(读锁) : 在同一段时间内,多个用户可以读取同一个资源, 读取过程中数据不会发生任何变化.
- 排它锁(写锁) : 在任何时候只能有一个用户写入资源, 当进行写锁时会阻塞其他的读锁或者写锁操作.
- 锁颗粒
- 表锁: 开销最小的锁策略
- 行锁: 开销最大的锁策略,也是支持最大并发处理的锁策略(每条记录上都加锁)
- 事务 : 用于保证数据库的完整性, (保证多条同步操作的数据同成败)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
- 索引 :是对数据表中一列或者多列的值进行排序的一种结构。使用索引可以快速访问数据表的特定信息。索引是进行记录快速定位的一种方法。索引好比目录。索引可以划分为:普通索引、唯一索引、全文索引。
特点 | MyISAM | InnoDB | Memory | Archive |
存储限制 | 246TB | 64TB | 有 | 无 |
事务安全 | - | 支持 | - | |
支持索引 | 支持 | 支持 | 支持 | |
锁颗粒 | 表锁 | 行锁 | 表锁 | 行锁 |
数据压缩 | 支持 | - | - | 支持 |
支持外键 | - | 支持 | - |