数据库的连接、索引和Redis的五种数据类型及其操作命令、使用场景

原文链接:

http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html

http://blog.csdn.net/cnham/article/details/2584683

http://www.cnblogs.com/lizhenghn/p/5322887.html

一、内连接、外连接和交叉链接

连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件。WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行。   

连接可分为以下几类:     

内连接取交集。外连接分为左连接右连接完全外部连接。左连接是左边的全取,右连接右边的全取。交叉连接也成为笛卡尔积,条数=列1x 列2,左表中的每一行均与右表中的所有行组合。

例子:   

扫描二维码关注公众号,回复: 2306961 查看本文章

-------------------------------------------------
  a表:     id   name                    b表:     id   job   staff_id   
              1   张3                                    1     23     1   
              2   李四                                  2     34     2   
              3   王武                                  3     34     4       
  a.id同b.staff_id   存在关系   

--------------------------------------------------    
 1) 内连接   
  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.staff_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   
    
  2)左连接   
  select   a.*,b.*   from   a   left   join   b     on   a.id=b.staff_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   
  3   王武                  null   

 

 3) 右连接   
  select   a.*,b.*   from   a   right   join   b     on   a.id=b.staff_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   
  null                       3     34     4   
    
 4) 完全连接   
  select   a.*,b.*   from   a   full   join   b     on   a.id=b.staff_id   

  结果是     
  1   张3                  1     23     1   
  2   李四                 2     34     2   
  null                   3     34     4   
  3   王武                 null

二、索引

索引提供指向存储在表的指定列中的数据值的指针,是对数据库表中一列或多列的值进行排序的一种结构。索引的实现通常使用B树及其变种B+树使用索引可以快速访问数据库表中的特定信息。

例如 employee 表的姓(lname)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

唯一索引unique,保证数据的唯一性,不允许重复。比如:

UNIQUE KEY ‘user_name_unique’ (‘user_name’) USING_BTREE

单索引组合索引,为了查询更加快速。比如:

KEY ‘order_no_index’ (‘order_no’) USING_BTREE,

KEY ‘order_no_user_id_index’ (‘user_id’,‘order_no’) USING_BTREE

b-tree 是mysql 索引默认使用的数据结构

给列组合增加unique约束

alter table a add CONSTRAINT [IX_a] UNIQUE ( [a1] , [vv1] );
在表a的列a1,vv1上添加UNIQUE 约束,约束名为IX_a

比如alter table T_CFG_USER_DEPOT add constraint‘User_Depot’ unique (DEPOT_ID,USER_ID);

索引占用磁盘空间,并且降低添加、删除和更新行的速度。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。在多数情况下,索引用于数据检索的速度优势大大超过它的。

http://blog.csdn.net/kennyrose/article/details/7532032

三、Redis的五种数据类型和使用场景

Redis目前支持5种数据类型,分别是:

  1. String(字符串)
  2. List(列表)
  3. Hash(哈希表)
  4. Set(集合)
  5. Sorted Set(有序集合)

其中:

1、String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

应用场景

String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

2、Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

应用场景

Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者push,消费者pop/bpop。

3、Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

应用场景

假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。

4、set 的内部实现是一个 value永远不为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

应用场景

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。

5、Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用场景

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。

下面就详细分别介绍这五种数据类型及其相应的操作命令。

http://www.cnblogs.com/lizhenghn/p/5322887.html

四、找第二大的数

select  *  from  table  where   order by desc limit 1,1

其中desc为降序排列,若不写默认为asc升序排列,limit 1,1为从位置下标1处开始找1个。

五、隔离级别

数据库提供了四种事务隔离级别不同的隔离级别采用不同的锁类来实现

READ UNCOMMITTED(未提交读) 幻想读、不可重复读和脏读都允许。一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是不正确的,所以多数的数据库都不会运用这种隔离级别。


READ COMMITTED(已提交读) 允许幻想读、不可重复读,不允许脏读。一个会话只能读取其他事务已提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。


REPEATABLE READ(可重复读) 允许幻想读,不允许不可重复读和脏读。在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改动。SQL Server是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。


SERIALIZABLE(可序列化度) 幻想读、不可重复读和脏读都不允许。在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别。在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。SQL标准所定义的默认事务隔离级别是SERIALIZABLE

http://blog.csdn.net/fg2006/article/details/6937413




猜你喜欢

转载自blog.csdn.net/gaiyindexingqiu/article/details/77448084