当前位置: 首页 > news >正文

新加坡网站建设公司怎么做网站的用户注册

新加坡网站建设公司,怎么做网站的用户注册,wordpress 二维码,网站建设价格标准信息什么时候使用B树索引 并不是所有查询条件下出现的列都需要添加索引。对于什么时候添加索引#xff0c;我们通过经验判断#xff0c;访问表中很少一部分行时候#xff0c;使用B树索引才有意义。对于性别字段#xff0c;地区字段#xff0c;类型字段#xff0c;他们取值范…什么时候使用B树索引 并不是所有查询条件下出现的列都需要添加索引。对于什么时候添加索引我们通过经验判断访问表中很少一部分行时候使用B树索引才有意义。对于性别字段地区字段类型字段他们取值范围很少即选择性低。如下sql select * from moment where status 1;对于性别状态可取值范围局限性非常大。对于上述SQL得到的结果可能是该表50% 的数据假设2中状态这时候添加B树索引完全没有必要。相反如果某个字段取值范围不固定几乎没有重复即高选择性此时使用B树索引是最合适的例如nickName 昵称字段基本上一个应用中都不给你重复出现。如上当访问选择性高的字段并从表中取出很少一部分行时候对这个字段添加B树索引是非常有必要的但是如果出现了访问字段是高选择性的但是取出的行数据占表中大部分数据时候MySql数据库可能就不会使用B树索引了我们看如下一个案例。 show index from New_UserBaseInfo;表New_userBaseInfo大约有450W条数据。encodePhone字段上有一个索引这时候我们查找 ‘89F5F342F1ABE260F4F3D728174CF379’ 这个加密手机号时候得到如下执行计划 explain select * from New_UserBaseInfo where encodePhone 89F5F342F1ABE260F4F3D728174CF379 可以看到 使用了idx_encodePhone这个索引也符合我们前面提到的套选择性选取表中很少行的原色但是入座执行下面的这条语句 explain select * from New_UserBaseInfo where encodePhone 89F5F342F1ABE260F4F3D728174CF379 可以看到possible_keys依然是idx_encodePhone但是实际上优化器使用的索引key是null 而且type是ALL说他他匹配到了对应的索引但是他并没有使用索引去查下还是全表查询。way因为这不符合我们之前说的规则虽然encodePhone 这个字段的值是高选择性但是我们取出的行数据中占了表中的一大部分数据。可以看到rows显示的是44W 数据包括99%的数据了。因此查询优化器并没有使用索引也许会有疑问查找加密手机号大于 89F5F342F1ABE260F4F3D728174CF379 的字段这种情况几乎不太可能出现。的确如此但是我们考虑New_UserBaseInfo上 的lastRegisterTime 字段注册时间改字段日期类型字段上有一个idx_lastRegisterTime 非唯一索引看如下两条查询语句 explain select * from New_UserBaseInfo where lastRegisterTime 2019-06-24;explain select * from New_UserBaseInfo where lastRegisterTime 2019-06-25;查找用户注册时间小于某个时间的sql语句。前后两条SQL只相差1天时间2条SQL语句的执行计划竟然不一样。在第二条SQL执行的时候虽然同样使用的idx_lastRegisterTime索引但是优化器却没有使用这个索引而是对全表扫描。 MySQL数据库的查询优化器会通过explain的rows字段预估查询可能的到的行如果大于某个值则B树会选择全表扫描。这个值大概是在20% 左右数据总量的时候会触发。即当我们取出的数据占比超过全数据量的20% 的时候优化器不会使用索引而是全表扫描。 但是rows中预估的数据并不是绝对准确的可以看大优化器判断日期小于2019-06-24 的数据是757912但是实际值462377 实际值少了大概38%这可能对查询优化器的选择产生一定的影响如果对比强制使用索引和使用优化器选择的全表扫描来查询注册日期小于2019-06-25的数据最终发现如下 select * from New_UserBaseInfo force index(idx_lastRegisterTime)where lastRegisterTime 2019-06-25;select * from New_UserBaseInfo where lastRegisterTime 2019-06-25;查询时间分别是1.45s5.8s第一句SQL强制使用idx_lastRegisterTime 索引所用的时间是4.15s根据优化器选择的全表扫方式执行第二SQL确5.8s因此优化器的选择并不完全是正确的有时候需要自己去判断。 顺序读随机读与预读取 之前介绍的规则中索引使用原则高选择取出表中少部分数据。但是为什么只能是少部分数据这就和InnoDB的顺序读和随机读取有关系 顺序读是指定顺序的读取磁盘上的快Block随机读Random Read是指访问的快不是连续的需要磁盘的磁头不断移动。当前传统机械磁盘的瓶颈之一就是随机读取的速度较低。在网上找的资料同时对比RAID磁盘阵列开启write back 和write Through的性能差异。测试磁盘是由4块15000转的硬盘组成的RADI 10.测试文件大小2GB块大小64KB。Write-throughCPU向cache写入数据时同时向memory(后端存储)也写一份使cache和memory的数据保持一致Write-backcpu更新cache时只是把更新的cache区标记一下并不同步更新memory(后端存储)。只是在cache区要被新进入的数据取代时才更新memory(后端存储)。 write backwrite Through顺序读193.7665.333随机读82.11716.218 可以看到不管是否开启RAID卡的Write Back功能磁盘的随机读性能都远远小于顺序读的性能。而上表中也说明了Write Back相对于Write Through 的性能提升。在数据库中顺序读是指根据索引的叶节点数据就能顺序的读取所需要的行数据。这个顺序只是逻辑上的顺序读取在物理磁盘上行对应的数据可能还是随机分布在磁盘上的不同地址。但是相对来说物理磁盘上的数据还是比较顺序的因为B树的构建是根据区来管理的区是64个连续的页。如根据主键进行读取或者通过辅助索引的叶节点就能读取到数据。随机读一般指访问辅助索引叶节点不能完全得到的结果需要根据辅助索引叶节点中的主键去找时机行数据。一般说来辅助索引和主键所在的数据段是不同的因此访问是随机的方式之前的sql lastRegisterTime ‘2019-06-25’ 这条就是典型的随机读取。而正是因为读取的方式是随机的并且随机读的性能会远低于顺序读取因此优化器才会选择全表扫描的方式而不是走 idx_lastRegisterTime 这个索引。 预读取 InnoDB存储引擎为了提高读性能引入了预读取技术。预读取是通过一次IO请求将多个页面预读取缓冲池中并且估计预读取的多个页马上会被访问。传统的IO请求每次只读取一个页在传统机械硬盘较低的IOPS下。预读取技术可以大大提高读取性能。 InnoDB有两个预读取的方法随机预读取Random read ahead和线性预读取linear read ahead 随机预读取指定一个区64个连续的页中的13个页面也在缓冲区中并且在LRU列表的前端即页是被频繁访问则InnoDB存储引擎会将这个区中神域的所有页预读到缓冲区。线性预读取基于缓冲池中的页的访问模式而不是数量。如果一个区中的24个页都被顺序访问了则InnoDB存储引擎会读取下一个区的所有页。LRU页解析Innodb为了加快对磁盘中数据的操作在操作磁盘上的数据时会先把数据存放到一块名为Buffer Pool的内存缓冲池中但是内存的大小远小于磁盘的大小因此需要一种机制来淘汰非热点数据保证内存中存在的数据是较为频繁访问的数据。LRU是这种管理场景下最常用的算法类似Redis中的LRU淘汰算法 新数据插入到链表头部每当缓存命中即缓存数据被访问则将数据移到链表头部当链表满的时候将链表尾部的数据丢弃。 InnoDB1.0.4 开始缩进访问的预读取被取消了而线性预读取还是保留了并且加入了innodb_read_ahead_threshold参数改参数标识一个区中的多少个页面被顺序访问时候InnoDB存储引擎才开启预读取即预读下一个区中所有页。默认值是56当一个区中56个页都被访问过则预读下一个区的所有项。 show VARIABLES like innodb_read_ahead_threshold固态硬盘的情况固态硬盘没有读写磁头读取不需要旋转因此随机读取性能得到质的提高。因为固态硬盘现在并没有全面普及所InnoDB存储引擎中没有见到对固态硬盘相关的一些优化。 辅助索引的优化 辅助索引的叶子节点包含主键但是辅助索引的叶子节点不包含完整的行信息因此InnoDB存储引擎总是会先从辅助索引的叶节点判断是否能得到所需要的数据。用如下案例解释 drop table if EXISTS tcreate table t(a int not null, b varchar(20), PRIMARY key(a), key(b));insert into t select 1, k;insert into t select 2, do;insert into t select 3, dr;insert into t select 4, an; select * from t;如上我们插入的数据我们执行如下查询语句 顺序如下 加入我们插入的数据如下 insert into t select 1, a;insert into t select 2, b;insert into t select 3, c;insert into t select 4, d; select * from t;查询结果如下 我们可以看到他的排序规则是按照b的顺序排列的并不是根据主键a的顺序排列这也就是我们上面提到的因为辅助索引中包含了主键的值因此访问b列上的辅助索引就能得到a的值这样就可以得到表中所有数据的值。 通常情况一个辅助索引页中能存放的数据比主键索引页上存放的数据多因此优化器选择了辅助索引 如果我们解释这句查询语句得到如下结果 可以看到优化器最终选择b索引如果想得到对列a的排序结果还需要对他进行Order By 操作这样优化器才会走主键避免在查询b列后又发生对a的排序操作。如下图 或者可以强制使用主键索引 联合索引 联合索引是指对表上的多个列做索引。之前说的情况都对表上的某个列进行索引。联合索引类似 alter table t add key idx_a_b(a,b);什么时候该使用联合索引在这个问题之前我们应该弄清楚联合索引内部的结构本质上联合索引还是 B树不同的是联合索引的键值数量不是1个二手大于等于2个。我们用简单的两个key的情况说明问题如上ab两个key我们用如下图表示 如上图中看到多个key情况的B树和我们之前讨论的单个键值没有什么区别键值都是排序的通过叶子节点可以逻辑上顺序的读出所有数据就上面的例子来说1,11,22,12,43,13,2数据按照ab的顺序存放。例如对于查询 select * from table where a xxx and b xxx这种情况显然可以用ab联合索引。对应单个a的查询 select * from table where a xxx也可以使用ab联合索引。但是对于select * from table where b xxx单个b的查询不可以用这个B树索引。可以看到叶子节点上b的值 1,21,4,12显然不是按排序的因此对于b列的查询使用不到ab的联合索引。联合索引的第二个好处可以对第二个键值进行排序例如很多情况我们都只查询某个用户订单信息并按照时间排序取出最近一段时间的购买记录这个时候使用联合索引可以避免多一次的排序操作。因为索引本身的叶子节点已经排序了。如下测试案例 create table buy_log(userid int unsigned not null, buy_date date);insert into buy_log values (1,2021-01-19), (2,2021-01-19), (3,2021-01-19), (1,2021-02-19), (3,2021-02-19), (1,2021-03-19), (1,2021-04-19);ALTER table buy_log add key(userid); alter table buy_log add key(userid, buy_date);如上建立两个索引都包含userid字段对userid进行查询看优化器的选择如下 如上possible_keys中有两个索引分别是单个userid和useridbuy_date的联合索引。优化选择的是userid因为改叶节点包含单个键值因此一个页能存放的记录更多接着看一下的查询我们假定要取出userid 1的最近三次购买记录并分析使用单个索引和符合索引区别 同样的都可以用两个索引但是这次优化器选择了符合索引因为这个联合索引中buy_date已经排序好了如果我们强制使用userid的单个索引会有如下结果 如上extra信息中看到Using filesortfilesort指排序但是不是文件中完成我们可以对比执行 如上看到增加了排序操作但是如果使用userid buy_date的联合索引userid_2就不会有这一次额外的操作如下 上一篇数据结构与索引-- B树索引 下一篇mysql技术分享-- 视图是什么
http://www.sadfv.cn/news/284519/

相关文章:

  • 网站做交互设计沈阳淘宝网站建设
  • 中国深圳航空公司官方网站做影视免费网站违法吗
  • 要制作一个自己的网站知名设计公司有哪些
  • 福田做网站福田网站建设福田建网站500圣诞节网站模板
  • 南京凯盛建设集团有限公司网站易做文学网站的logo
  • 团队建设网站app界面设计模板图
  • 长春网页建站模板城市规划建设网站
  • 关于优化网站建设的方案游戏网站平台怎么做的
  • 网站备案需要哪些资料自己做的网站发到网上
  • 工装网站建设方案专业做旅游网站的公司
  • wordpress 视频站模板下载失败建立网站做淘客
  • 推荐十个网站网页制作作品
  • 泉州住房和城乡建设部网站网站宣传海报图片
  • 网站的建设ppt深圳包装设计公司有哪些呢
  • 国家工商局网站官网昆明做网站优化价格
  • 公司网站建设及安全解决方案电子商务策划书模板
  • 学校网站模板 html海珠建网站公
  • 建设银行网站首页是多少怎么免费申请网站
  • 重庆网站设计公司wordpress后台登录地址变更
  • 有哪些是外国人做的网站吗网站域名是网站架构吗
  • 给国外做网站化学试剂购买网站
  • 做网站的国标有哪些推广品牌
  • 展馆设计网站推荐google搜索引擎入口下载
  • 企业网站的建设公司价格邢台网站设计哪家好
  • 难道做网站的工资都不高吗网站建设技术风险分析
  • 什么软件可以做网站html网站建设运维标准
  • 淘宝客网站主机适合设计师的网站编辑软件
  • 合肥网站seo费用石家庄建站系统
  • 荆门网站建设514885公司制作网站价格
  • 网站开发流程及顺序潍坊建设局职称公布网站