非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,如下图
不管以任何形式查询表,绝大部分都要通过聚焦索引来进行定位, 聚集索引(主键)是通往真实数据所在的主要路径。
非聚焦索引流程
#创建索引 create index_age name on user_info(age); #查询年龄为20的用户名 select name from user_info where index_age = 20;首先,通过非聚集索引index_age查找age等于20的所有记录的主键ID值
然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置
最后, 从得到的真实数据中取得naem字段的值返回, 也就是取得最终的结果
复合索引即多字段查询
#创建复合索引 create index index_birthday_and_user_name on user_info(birthday, user_name); #查询生日为1993-11-1的用户名 select user_name from user_info where birthday = '1993-11-1'通过非聚集索引index_birthday_and_user_name查找birthday等于1993-11-1的叶节点的内容,然而, 叶节点中除了有user_name表主键ID的值以外, user_name字段的值也在里面, 因此不需要通过主键ID值的查找数据行的真实所在, 直接取得叶节点中user_name的值返回即可。 通过这种覆盖索引直接查找的方式, 可以省略不使用覆盖索引查找的后面两个步骤, 大大的提高了查询性能
创建索引的语句创建索引
CREATE INDEX name_index ON Employee (Employee_Name)联合索引
CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age) 3 Redis原理概述
是一个完全开源免费的key-value内存数据库
通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
Redis数据库
Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。在使用缓存的时候,redis比memcached具有更多的优势,并且支持更多的数据类型,把redis当作一个中间存储系统,用来处理高并发的数据库操作.
Redis存储的优点:
速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
自动操作:对不同数据类型的操作都是自动的,很安全
快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
Redis缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
Redis的常见应用场景
一:缓存——热数据
热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存
Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis
update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据
二:计数器
诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能! redis只是存了内存,记住要持久化,命令用 INCRBY
INCR user:<id> EXPIRE三:队列
由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以判断用户是第几个访问这种业务
队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用
四:位操作(大数据处理)
用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。
原理是: