引擎
- 表引擎:组织数据的方式
- 常见的存储引擎与其特点
特点 | Myisam | BDB | Memory | InnoDB | Archive |
---|---|---|---|---|---|
存储限制 | 没有 | 没有 | 有 | 64TB | 没有 |
事务安全 | - | 支持 | - | 支持 | - |
锁机制 | 表锁 | 页锁 | 表锁 | 行锁 | 行锁 |
B树索引 | 支持 | 支持 | 支持 | 支持 | - |
哈希索引 | - | - | 支持 | 支持 | - |
全文索引 | 支持 | - | - | - | - |
集群索引 | - | - | - | 支持 | - |
数据缓存 | - | - | 支持 | 支持 | - |
索引缓存 | 支持 | - | 支持 | 支持 | - |
数据可压缩 | 支持 | - | - | - | 支持 |
空间使用 | 低 | 低 | N/A | 高 | 非常低 |
内存使用 | 低 | 低 | 中等 | 高 | 低 |
批量插入的速度 | 高 | 高 | 高 | 低 | 非常高 |
支持外键 | - | - | - | 支持 | - |
- myisam是mysql的默认存储引擎,从mysql5.x版本以后,默认的引擎改为了InnoDB;
- InnoDB写入效率不如myisam,并且会占用更多磁盘空间以保留数据和索引;
- Memory存储引擎,它的数据存储方式是将数据存储在内存中,所以它的读写速度都非常快,但是它的数据存储是非持久化的;
- 各种存储引擎还有很多,想要在一个应用中,将数据的操作发挥到极致,就得合理的结合它们各自的特点;
字符集
字符集:字符的编码方式
举几个编码方式的例子:UTF-8、GBK、GB18030、ISO-8859-15……
乱码:对于计算机来说,没有乱码一说,只不过是你本来存储的字符的字符集与现在你看到的字符的字符集不一致,导致的所谓的乱码;
- 乱码的产生是因为,不同的客户端,字符集不一样,例如在PHP页面中编码一般都是UTF-8,但是在CMD中,它的编码是GBK;
- 那么解决乱码的问题,就是,不同客户端,设置不同的字符集,
set names utf-8;
/set names gbk;
; - set names 字符集;这句话等价于:character_set_client、character_set_connection、character_set_results;
校对集:就是服务器排序规则,它决定了数据的排序规则
校对集分类:
_bin
: binay,二进制比较,区分大小写._cs
: case sensitive,大小写敏感,区分大小写。_ci
: case insensitive,大小写不敏感,不区分大小写。
MySQL支持的校对集有上百种,如何选择?
- 一般选择
_ci
的。 - 一般字符集都是utf8的,所以校对集也选择utf8的,例如
utf8mb4_general_ci
。
索引
索引的概念
索引是数据在磁盘上的目录,索引保存着,真正的数据在磁盘中的位置,
也可以理解成,一张表就是一本书,数据是内容,每一本书都有目录,目录对应着页码,
通过目录找到想要的内容的页码,比自己从第一页开始翻直到找到你想要的内容速度要快,所以,因为有索引,提高了查询的速度,索引保存的是一个指针;
索引之所以比直接在磁盘中查找要快,是因为,索引的特殊的数据结构和查询算法;索引提高了查询速度,相应的降低了增删改的速度,因为不管是增加还是删除还是更改,数据变了,那么索引的结构也要相应的变化;
一般在查询比较频繁的列上,才会去加索引,而且重复度低的列上加,效果更好;
如果不能合理的使用索引,那么就会出现索引文件比数据文件还要大,就是目录比书还厚,需要再来一本书来管理 《目录》 这本书;
索引的类型
key
: 普通索引,提高查询速度unique key
: 唯一索引,提高查询速度,还能约束数据,这个数据不可能重复了,比如一个网站用户的用户名不能重复,邮箱不能重复…,这时候就可以应用唯一索引primary key
: 主键索引,一张表中只可能出现一个fulltext
: 全文索引,(中文环境下,全文索引无效,要分词+索引,一般使用第三方解决方案,如:sphinx)
索引长度
- 建立索引时,可以只索引列的前一部分,比如,这个列的前10个字符;
- 在建立索引时:
key name(name(10))
; 这里的限制长度不是表中可存储的长度,而是索引中对应的长度,只取前10个字符;
多列索引
- 就是把两列或多列的值,看成一个整体,然后建索引;
create table t11(
xing char(2),
ming char(10),
key xm(xing,ming)
);
这里,两个列,用了一个索引,但是在查询时,同时进行两列的查询,则会使用到xm索引,但是对某一列进行查询,则不一定会使用到xm,这里就是有个左前缀的规则
左前缀,最左优先,以最左边的为起点任何连续的索引都能匹配上;
冗余索引
- 在某个列上,可能存在多个索引
示例:
create table test(
firstname char(2),
lastname char(10),
key allname(firstname,lastname)
);
查找firstname的时候,使用的是allname索引;
查找firstname和lastname的时候,使用的是allname索引;
查找lastname的时候,没有用到索引;
为了提高查找效率,增加一个冗余索引,key lastname(lastname)
;
create table test(
firstname char(2),
lastname char(10),
key allname(firstname,lastname),
key lastname(lastname)
);
查找firstname的时候,使用的是allname索引;
查找firstname和lastname的时候,使用的是allname索引;
查找lastname的时候,使用的是lastname索引;
可以使用explain
+ 查询语句
,来查看当前查询语句是否使用到了索引;
冗余索引在日常工作中会经常使用到,在开发中,有时也是非常有必要的;
索引操作
查看当前查询语句的一些信息
explain select * from 表名 where name='小明';
;
查看索引
show index from 表名;
;show create table 表名
;
删除索引
alter table 表名 drop index 索引名
;drop index from 表名
;
添加索引
alter table 表名 add [index/unique] 索引名(列名);
添加普通索引和唯一索引alter table 表名 add primary key (列名);
添加主键索引
删除主键索引
alter table 表名 drop primary key;
MySQL函数
函数的几个类别
- 数学函数
- 字符串函数
- 日期和时间函数
- 条件判断函数
- 系统信息函数
- 加密函数
- 格式化函数
示例:随机生成0-10的随机数
select floor( rand() * 10 );
;
函数就是帮助我们更好的、更快的处理数据;它有很多,用到再查;
事务
启动、确认、回滚事务
start transaction;
: 启动一个事务commit;
: 确认一个事务rollback;
: 回滚一个事务到开始之前的状态事务的原子性体现
事务的概念
- 事务只有开始和结束的状态,中间进行中的状态是不被保存的,
- 只有当commit 之后,事务的状态进入结束状态,事务的进行中发生的操作被保存,rollback也是一样;
事务的应用场景
- 例如银行汇款,这个汇款的操作,就需要事务来进行保证,假如A
给B
汇款,那么当A
刚刚输入完密码,钱刚从它的账户被划走,还没有到达B
的账户,同时A
也没有最终对这笔汇款进行最终的确认,那么此时又突然断电,ATM机突然地震,轰然倒塌,银行卡也没有了,这个时候,钱哪儿去了?此时如果应用了事务的概念,那么,当A
没有对汇款做最后一次确认的时候,事务没有结束,这个时候因为不可抗拒的原因,导致无法进行汇款的下一步操作,那么则设置超时时间,超出15分钟,则此次事务,自动回滚,表示失败,汇款失败;而这次失败的记录仅出现再A
的账户中,B
的账户永远不会出现这次汇款失败的记录;
事务的特性(ACID特性)
- 隔离性:只能看到事务开始前的状态和结束后的状态,看不到事务进行中的状态;多个事务并发时,事务之间是隔离的
- 原子性:要么都成功,要么都不成功;
- 一致性:事务的开始之前,和结束之后,业务逻辑上,保持总体的一致;
- 持久性:发生过的不可挽回,它已经发生了,你不可能装作这个事务没有发生过,假如这次事务是错误的,你只能再来一个事务将这个错误修正;
ACID特性参考博客1
ACID特性参考博客2
注意
事务,innodb中可以使用,Myisam不支持