索引创建的原则
建索引的原则 1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。 2、=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。 3、尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。...
Redis 队列消费
数据结构 list - 先进先出 - 左进右出 归纳 实现方式 操作 效果 单list 左进右出 lpush rpop 最简单,实际应用比较局限 多list brpop list1 list2 0 推荐用法,实际应用最为合适 特定单list list1 - 高优list2 - 普通 实现复杂优先级,但实现比较复杂,不利于维护 优先级实现方式 通常使用一个list来实现队列操作, 这样有一个小限制,所以的任务统一都是先进先出, 如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式: 单一列表实现: 队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop) 使用两个队列 一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出...
HTTPS
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。 HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。通常,HTTP 直接和 TCP 通信。当使用 SSL时,则演变成先和 SSL通信,再由 SSL和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的 HTTP。 HTTPS通讯方式: 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公...
HTTP 三次握手
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。 为什么要进行三次握手呢? 第三次握手是为了防止失效的连接请求到达服器,让服务器错误打开连接。 客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间...
HTTP四次挥手
第一次挥手,客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1状态,表示客户端没有数据要发送给服务端了。 第二次挥手,服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。 第三次挥手,服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。 第四次挥手,客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。四次挥手 为什么要四次挥手?客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。 HTTP持久连接如果有大量的连接,每次在连接,关闭都要经历三次握手,四次挥手,这显然会造成性能...
索引回表
回表 查询时一些字段值拿不到,需要到主键索引B+树再查一次。 根据索引进行条件查询,回到主键索引树进行搜索的过程 因为查询还要回表一次,再次查询主键索引树,所以实际中应该尽量避免回表的产生。 解决回表问题可以建立联合索引进行索引覆盖,如图所示根据name字段查询用户的name和sex属性出现了回表问题: 那么我们可以建立下面这个联合索引来解决: 123456create table user ( id int primary key, name varchar(20), sex varchar(5), index(name, sex)) engine = innodb; 建立了如上所示的index(name,sex)联合索引,在二级索引的叶子结点的位置就会同时也出现sex字段的值,因为能够获取到要查询的所有字段,因为就不用再回表查询一次。 强制索引 force index
索引的概念
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分), 它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 索引的实现通常使用B树及其变种B+树。 更通俗的说,索引就相当于目录。 为了方便查找书中的内容,通过对内容建立索引形成目录。 而且索引是一个文件,它是要占据物理空间的。 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 比如我们在查字典的时候,前面都有检索的拼音和偏旁、笔画等, 然后找到对应字典页码, 这样然后就打开字典的页数就可以知道我们要搜索的某一个key的全部值的信息了。
创建索引
在执行CREATE TABLE时创建索引 12345678910CREATE TABLE user_index2 ( id INT auto_increment PRIMARY KEY, first_name VARCHAR (16), last_name VARCHAR (16), id_card VARCHAR (18), information text, KEY name (first_name, last_name), FULLTEXT KEY (information), UNIQUE KEY (id_card)); 使用ALTER TABLE命令去增加索引。 1ALTER TABLE table_name ADD INDEX index_name (column_list); ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。 索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一...
TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议) 是指能够在多个不同网络间实现信息传输的协议簇。 TCP/IP协议不仅仅指的是TCP 和IP两个协议, 而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 同时是Internet最基本的协议、Internet国际互联网络的基础, 由网络层的IP协议和传输层的TCP协议组成。 TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。 互联网中的设备要相互通信,必须基于相同的方式, 比如由哪一方发起通讯,使用什么语言进行通讯,怎么结束通讯这些都要事先确定, 不同设备之间的通讯都需要一种规则,我们将这种规则成为协议。 TCP/IP协议中最重要的特点就是分层。 由上往下分别为 【应用层】、【传输层】、【网络层】、【数据链路层】、【物理层】。 当然也有按不同的模型分为4层或者7层的。 应用层TCP/IP模型将OSI参考模型中的会话层和表示...
UDP
用户数据报协议 UDP(User Datagram Protocol):无连接;尽最大努力的交付;面向报文;无拥塞控制;支持一对一、一对多、多对一、多对多的交互通信;首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。UDP是面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。 传输控制协议 TCP(Transmission Control Protocol):面向连接;每一个TCP连接只能是点对点的(一对一);提供可靠交付服务;提供全双工通信;面向字节流。应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。 UDP的首部格式: 用户数据报有两个字段:数据字段和首部字段,数据字段很简单,只有8个字节,由四个字段组成,每个字段的长度都是两个字节。各字段意义如下: 源端口: 源端口号,在需要给对方回信时使用。不需要是可全用0. 目的端口号: 这在终点交付报文时必须使用...




