mysql 笔记 六 存储引擎 事务 索引 存储过程

存储引擎

一部电影 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密码  库名 表3  >  地址 .sql

也可以不写表名 导出整个库

Mysqldump -uroot -paaaaaa  aaaa  account > d:\\account.sql

但是不能同时导入多个数据库 但是可以加个 -Bdatabase)这样就是以库为单位 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小 32的右边  找到了!

一万的数据 有可能减少到 14次以下就找到了  

索引 不光要把数据插入数据库 而且还要修改索引 

索引加快了查询的速度 

减慢了 删改查的速度  

索引文件 也是文件  也会有大小  有时候 索引文件 有的比数据文件还大

如果有表 带索引  那么应该如何导入呢  

可以先修改表 去掉索引  然后导入  然后统一加索引

不要过度索引 

索引尽量增加到 查询很频繁的列  比如 id   用户名 

尽量索引散列值   过于集中的索引不要  越不重复越好 

Frm  是表结构的意思

Myddata)  就是数据的意思 存储数据

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   其他都一样

  

你可能感兴趣的:(mysql)