mysql笔记B

MySql Front:

Auto_increment:自动增长型主键.

****MySql的存储引擎(表类型):

MyISAM:不支持事务,5.1版本MySql不支持MyISAM.

InnoDB: 支持事务 低级别锁定(当你在这一行上面操作的话,这行将被锁定).

BerkeleyDB(BDB):支持事务页级锁定(锁定一个页面(大约是8KB)).

Memory:内存引擎.

CSV: CSV存储引擎使用逗号分隔值格式的文本文件存储数据.

Example:存储引擎.

Archive:归档引擎.

各种表类型之间的差别:

1.       支持的字段,数据类型.

2.     锁定类型.

3.     索引.

4.     事务处理.

 

各存储引擎之间的区别:

  为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。

 

字段和数据类型:

  虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。

  这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。

 

  锁定:

  数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。

  锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。  不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。

  页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。

行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。

 

  建立索引:

  建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。

  有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。

 

  事务处理:

事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。

 

今日总结:

1.子查询引用了外部查询的列exists.

2.mysql front :(1).auto_increment.(2).表类型.

3.索引→死水,数据库如果没有索引的话就像一滩死水一样.

 

3.29

1.数据库为什么引入索引机制:

  用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了提高检索数据的能力,数据库引入了索引机制。

2.有关索引的比喻:

  从某种程度上,可以把数据库看作一本书,把索引看作书的目录,通过目录查找书中的信息,显然较没有目录的书方便、快捷。

3.数据库索引实际是什么?(两部分组成)

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

4.索引在表中的角色

一个表的存储是由两部分组成的,一部分用来存放表的数据页面,另一部分存放索引页面。索引就存放在索引页面上,

5.索引高效原理                                                         

  通常,索引页面相对于数据页面来说小得多。当进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针,再直接通过指针从数据页面中读取数据。

索引大多是按照二叉树的原理来存储的.

6.索引的概念

索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

7.索引的优点

  1.创建唯一性索引,保证数据库表中每一行数据的唯一性

   2.大大加快数据的检索速度,这也是创建索引的最主要的原因

  3.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

  4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。

8.索引的缺点

  1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

  2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。索引既然提高了数据的查询速度,就降低了增加和删除的速度.

9.索引的分类:

    1.聚集索引与非聚集索引(簇索引和非簇索引).

聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列.

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。

建议使用聚集索引的场合为:   

a.此列包含有限数目的不同值;   

b.查询的结果返回一个区间的值;   

c.查询的结果返回某值相同的大量结果集。

  

非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。

建议使用非聚集索引的场合为:   

a.此列包含了大量数目不同的值.

b.查询的结束返回的是少量的结果集;   

c.order by 子句中使用了该列。

 

1.直接创建索引和间接创建索引

  直接创建索引: create index mycolumn_index ON mytable (myclumn)

间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引

创建索引

create index 索引名 on 表名(列名(length)); 如果是char,varchar类型,length可以小于字段实际长度;如果是blob和text类型,必须指定 length,下同。

删除索引:

drop index 索引名 on 表名

普通索引和唯一性索引

  普通索引create index mycolumn_index on mytable (myclumn)

  唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用

create unique coustered index myclumn_cindex on mytable(mycolumn)

create unique index 索引名 on 表名(字段名(length))

单个索引和复合索引

  单个索引:即非复合索引

复合索引:又叫组合索引,在索引建立语句中同时包含多个字段名,字段名之间用逗号分开.

 

六、索引的使用

  1.当字段数据更新频率较低查询使用频率较高并且存在大量重复值是建议使用聚簇索引

  2.经常同时存取多列,且每列都含有重复值可考虑建立组合索引

  3.复合索引的前导列一定好控制好,否则无法起到索引的效果。如果查询时前导列不在查询条件中则该复合索引不会被使用。前导列一定是使用最频繁的列

  4.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案

  5.where子句中对列的任何操作结果都是在sql运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被sql优化器优化,使用索引,避免表搜索(例:select * from record where substring(card_no,1,4)=5378

&& select * from record where card_no like 5378%)任何对列的操作都将导致表扫描,从而使索引失效;它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边

避免在列上进行操作,否则将引起全表扫描

  6.where条件中的in在逻辑上相当于or所以语法分析器会将in (0,1)转化为column=0 or column=1来执行。我们 期望它会根据每个or子句分别查找,再将结果相加,这样可以利用column上的索引;但实际上它却采用了"or策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用column上索引,并且完成时间还要受tempdb数据库性能的影响。in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引

在索引中,不能有NULL,否则索引会失去效果.

 

视图:

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

 

视图与表的区别:

1.表的数据存在于磁盘上,视图默认情况下物理上是不存在的.

2.视图由表派生出来的一个数据库对象,视图又叫虚表.

3.唯一物理存在的视图名和从表中查询行的方法.

 

视图的作用:

1、限制表中特定行和列的使用,因此视图可以用来控制一个或多个表中特定部分的访问;

2、简化操作,隐藏复杂查询;

3、安全性,让客户只能看到视图,没有操作的任何权限;

4、合并分割数据;

5、将插入或更新数据限制在一定范围中。

 

最简单的清除方式:

truncate test;清空表格中的数据

 

删除数据deletetruncate的区别

    1truncate是逐页删除数据的而delete是逐行删除的所以说truncatedelete删除速度要快

    2、truncate操作立即生效,原数据不放到回滚段中,不能回滚,删除数据没有日志文件不能恢复,而delete这个操作会放到回滚段中,事务提交之后才生效;可以恢复。

    3、delete语句是dml,如果有相应的触发器,执行的时候将被触发. truncate是ddl,  操作不触发触发器.

 

MySQL表的复制

创建表的副本:

创建一个完全和上表表结构一样,数据也一样的新表,即直接复制原表的表结构可以用如下SQL语句

/*

用子查询,创建表,表的结构呢完全和nickname一致,并且数据也相同

*/

create table new_nickname select * from nickname;

只创建含有特定字段的表副本:

有的时候呢,我需要一个新表,只需要有昵称表的name与desc两个字段即可,不需要id字段,同样使用子查询,不过不再是select * 而是直接select 想要的字段即可

/*

因为只想要name和desc字段,所以我只查询原表的这两个字段即可

*/

create table new_nickname select name, desc from nickname;

只创建含有约束条件的值的表副本:

比如说,突然间我只想要那个id < 3的昵称表的所有数据咋办呢?(我不是矫情啊,是为了举例啊!)这个时候,我们就需要为子查询加上条件限制,where 语句大家没有忘吧?

/*

限定条件,只要id<3的数据

*/

create table new_nickname select * from nickname where id < 3;

只复制表结构,咱爷们不要表数据:

有的时候呢,我只想复制旧表的表结构,至于里面的数据呢?已经old了,我是不想要的,即我只想复制一个表的表结构,这个时候咋办呢?别怕,我教你三种方法,均可解决此问题。

/*

和上面复制特定数据一样,只不过呢,咱这个条件弄个恶心点的,

当0=1的时候我才要你的数据,显然不会复制任何数据了

*/

create table new_nickname select * from nickname where 0 = 1;

上面的方法是取巧,因为没有合格的数据符合限制条件,所以被复制的当然只有表结构了。另外MySQL提供了一个现成的语法,那就是:create table new_talbe_name like old_table_name;

/*

应用create table like 语法,只复制表结构

*/

create table new_nickname like nickname;

第三种方法就是用咱们之前取过外键key_id的方法,显示创建表时的SQL语句然后复制,显示建表语句的方法为:show create table table_name;

复制旧表部分结构,同时增加新字段:

人都要创新嘛,社会在进步,如果还停留不前的话是会淘汰的,所以咱也不能单纯的复制,也要有点自己的个性,在我的地盘听我的嘛。比如说复制昵称表的同时呢,我要创建一个新的字段,就是昵称创建日期字段。嗯。

/*

咱也个性点,新字段咋的也得先声明一下,再复制想要的那部分字段,嘿嘿

*/

create table new_nickname (create_time date not null, status enum('1','2')) select name, desc from nickname;

 

什么是存储例程?

 存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。

存储过程:*是一组为了完成特定功能的SQL语句,经过编译后存储在数据库服务器之中

存储过程的优点

1、减少应用程序的逻辑复杂性;

    2、存储过程允许模块化设置;

    3、存储过程创建后,可以多次调用,对存储过程的修改对应用程序毫无影响;

    4、存储过程可以快速的执行效率;

    5、能够减少网络流量;

6、可以作为一种安全机制来充分利用,防止sql被黑客攻击。

创建存储过程:

Create procedure 过程名() select helloworld;

查询存储过程:

Call 过程名();

 

存储过程的类型:

1.无参

2.有输入参数

3.有输出参数

4.有输入输出参数

 

输出值:

Call 过程名(@a)select @a;

 

过程与函数的区别: 过程里面没有返回值,可以有一个或多个输出参数,函数有且只有一个返回值.

 

2010.3.31

游标:

游标:游标是读取数据库的一个玩意.

******游标的使用过程:

1.     声明游标(定义游标).

2.     打开游标.

3.     使用游标.

4.     关闭游标.

游标:*定义:它是一种能从包括多数据记录的结果集中,每次只读一条记录的机制,把集合操作转换成单个记录处理方式,游标机制允许用户在数据库内逐行的访问这些记录,按照用户自己的意愿来显示和处理这些记录。

什么是游标: 能够一行一行的读取数据的结果集,把集合操作转换成单个记录处理方式.

游标的语法:

Begin

declare 变量名 varchar(10);

    declare 游标名 cursor for select*from 表名;(结果集)   创建游标

declare continue handler for sqlstate '02000' set 变量名 = null; 

    Open 游标名;                                          打开游标

    Fetch 游标名 into 变量名;

    While(变量名 is not null) do

        Select 变量名;

        Fetch 游标名 into 变量名;

    End while;

    Close 游标名;

End;

例如:

打印姓名(一列):

BEGIN

    declare newName varchar(10);    

    declare newNonius cursor for select*from nonius;/*(结果集)   创建游标*/

    declare continue handler for sqlstate '02000' set newName = null; 

    Open newNonius;                                           /*打开游标*/

    Fetch newNonius into newName;

    While(newName is not null) do

        Select newName;

        Fetch newNonius into newName;

    End while;

    Close newNonius;

END;

 

打印姓名和年龄(两列):

BEGIN

    declare newName varchar(10);  

    declare newAge int; 

       declare newNonius cursor for select name,age from nonius;/*(结果集)   创建游标font-

你可能感兴趣的:(数据结构,sql,mysql,应用服务器,搜索引擎)