存储引擎
一部电影 mp4 wma avi flv 各种格式
数据也有多种管理方式,那么这些不同的管理方式 就是存储引擎的概念
Create table aaa (
)
Engine myisam 设置引擎
Charset utf8 设置编码
常用的引擎
Myisam 批量插入速度快 不支持事务 锁表 支持全文索引
innoDB 批量插入速度慢 支持事务 锁行 5.5支持全文索引
事务
通俗的讲 就是一组操作要么都成功 要么都失败 -- 原子性
在所有操作都没执行完毕之前 其他的都看不到中间改变的问题 -- 隔离性
事务发生前发生后 总额的正确性 -- 一致性
事务产生的影响 是不能撤销的 只能在开另一个事务 --- 持久性
也有人叫 acid 特性
开启事务
Start transaction
写 sql语句。。。。。。。。
成功执行后
Commit 执行 事务内的sql语句
失败
rollback 回滚
下次执行的时候 还要再次开启
有些语句 会隐式提交事务 比如重复输入 start transation
用了事务之后 一些sql语句 会被记录到 mysql 事务日志里面了 用了commit之后 就集中的提交了 如果用了 rollback 就不提交
《数据库概念》
备份与恢复
系统运行中
增量备份 每天备份每天增加的
整体备份 每周整体备份一次
如果周五除了问题 可以用 周日的整体备份 + 1234的增量备份 恢复
备份的工具 有第三方的收费备份工具
也有系统自带的简单的备份工具
在 mysql 安装目录的
Mysql/bin/mysqldump.exe
用mysqldump 导出 一个表
在cmd 下面 用
mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 地址 .sql
也可以不写表名 导出整个库
Mysqldump -uroot -paaaaaa aaaa account > d:\\account.sql
但是不能同时导入多个数据库 但是可以加个 -B(database)这样就是以库为单位 mysql 就不会误会了
如果你真的很懒 想要导出全部的库 这样就能导出所有的数据库了
Mysqldump -uroot -paaaaaa -A(all) >d:\\all.sql
恢复
只要把刚才的好多sql语句 一下子执行一次就好了
以库为单位
Source d:\\aa.sql; 这一条语句就好了
以表位单位
只要
Mysql > use 库名
Mysql > source 备份文件就好了
如果不登陆到 mysql 那么怎么恢复库呢
Mysql -uroot -paaaaaa < D:\\\aa.sql
不登陆 针对表级的文件 怎么恢复呢
Mysql -uroot -paaaaaa aaaa(库名)
索引
设置有N条记录 不用索引 要找 n/2 次
如果有了索引 也许只要找1次
Tree 二叉树 索引 log2/n
Hash 索引 1次
二叉树
4
2 6
1 3 5 7
如果找3 先从4开始找 然后找到2 2 比3小 3在2的右边 找到了!
一万的数据 有可能减少到 14次以下就找到了
索引 不光要把数据插入数据库 而且还要修改索引
索引加快了查询的速度
减慢了 删改查的速度
索引文件 也是文件 也会有大小 有时候 索引文件 有的比数据文件还大
如果有表 带索引 那么应该如何导入呢
可以先修改表 去掉索引 然后导入 然后统一加索引
不要过度索引
索引尽量增加到 查询很频繁的列 比如 id 用户名
尽量索引散列值 过于集中的索引不要 越不重复越好
Frm 是表结构的意思
Myd(data) 就是数据的意思 存储数据
Myi (index) 就是数据库的索引文件
索引分类
普通索引 (index) 仅仅是加快查询速度
主键索引 primary key 主键不能重复 主键索引必须是唯一的 一张表只有一个主键
唯一索引 unique index 行上的值不能重复 唯一索引不一定是主键 但是可以有多个唯一索引
全文索引 fulltext index
查看一张表上的索引
Show index from 表名 \G 是以列来显示
建立索引
Alter table 表名 add [ index / unique index / fulltext / primary key / ] 【索引名(可选)】 (列名)
Alter table member add index tel (tel); 普通索引
Alter table member add unique (email) 唯一索引
Alter table member add fulltext (intro) 全文索引
主键 索引
Alter table member add primary key (列名) 不用写索引名 因为索引就这一个
Alter table member add primary key (id) 主键
删除索引
Alter table 表名 drop index 索引名 最后是写索引名
Alter table member drop index intro 删除索引
但是怎么删除主键索引呢 主键索引 没有索引名 直接写primary key 就好了
Alter table member drop primary key
大数据导入导出的时候 就先删除 表的索引 然后在集中建立索引
索引创建原则
不要过度索引
索引尽量散列值
在where条件最频繁的值上加索引
全文索引
在mysql 默认设定中 对中文意义不大
如果是大文章的话 没有用全文索引 找一个词 要用 like 那是一行一行的找 效率 很低很低的
全文索引查找方式
Select * from member where match(列名) against('查询内容');
Select * from member where match(initr) against('databases');
一般很多词 都是停止词 所以索引不出来
可以查看某个单词的匹配度
Select match('intro') against('data') from member;
全文索引在默认情况下 对中文的意义不大 全文索引是针对文章中每一个词 做索引的 但是 中文 都是一句话 一句话的 所以 分词技术 很难 国内也就几家公司能做 比如百度 就像163都做不起来 最多也就有个很大的词库 来分析词
存储过程
存储过程 类似于一个函数 就是把一段sql 语句 封装成一个整体 当要使用的时候 可以调用这个存储过程来实现
在封装的语句体里面 可以用 if else case while 等控制结构
列也可以当成变量来看 所以 存储过程 可以当成一个程序来看 可以进行 sql编程
查看现有的存储过程
Show procedure status;
删除存储过程
Drop procedure 存储过程名称;
写一个存储过程
Create procedure p1()
Begin
Select * from g;
End$
调用存储过程
Call p1();
存储过程和函数的区别 一个名字不同 一个 没有return 其他都一样