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

给网站加织梦后台p2p网站开发维护

给网站加织梦后台,p2p网站开发维护,建设网站深圳,seo做论坛和企业网站差别来源 | 科技缪缪想进大厂#xff0c;mysql不会那可不行#xff0c;来接受mysql面试挑战吧#xff0c;看看你能坚持到哪里#xff1f;能说下 myisam 和 innodb 的区别吗#xff1f;myisam引擎是5.1版本之前的默认引擎#xff0c;支持全文检索、压缩、空间函数等#xff0… 来源 | 科技缪缪想进大厂mysql不会那可不行来接受mysql面试挑战吧看看你能坚持到哪里能说下 myisam 和 innodb 的区别吗myisam引擎是5.1版本之前的默认引擎支持全文检索、压缩、空间函数等但是不支持事务和行级锁所以一般用于有大量查询少量插入的场景来使用而且myisam不支持外键并且索引和数据是分开存储的。innodb是基于聚簇索引建立的和myisam相反它支持事务、外键并且通过MVCC来支持高并发索引和数据存储在一起。说下mysql的索引有哪些吧聚簇和非聚簇索引又是什么索引按照数据结构来说主要包含B树和Hash索引。假设我们有张表结构如下create table user(id int(11) not null,age int(11) not null,primary key(id),key(age) ); B树是左小右大的顺序存储结构节点只包含id索引列而叶子节点包含索引列和数据这种数据和索引在一起存储的索引方式叫做聚簇索引一张表只能有一个聚簇索引。假设没有定义主键InnoDB会选择一个唯一的非空索引代替如果没有的话则会隐式定义一个主键作为聚簇索引。这是主键聚簇索引存储的结构那么非聚簇索引的结构是什么样子呢非聚簇索引(二级索引)保存的是主键id值这一点和myisam保存的是数据地址是不同的。最终我们一张图看看InnoDB和Myisam聚簇和非聚簇索引的区别。 那你知道什么是覆盖索引和回表吗覆盖索引指的是在一次查询中如果一个索引包含或者说覆盖所有需要查询的字段的值我们就称之为覆盖索引而不再需要回表查询。而要确定一个查询是否是覆盖索引我们只需要explain sql语句看Extra的结果是否是“Using index”即可。以上面的user表来举例我们再增加一个name字段然后做一些查询试试。explain select * from user where age1; //查询的name无法从索引数据获取 explain select id,age from user where age1; //可以直接从索引获取锁的类型有哪些呢mysql锁分为共享锁和排他锁也叫做读锁和写锁。读锁是共享的可以通过lock in share mode实现这时候只能读不能写。写锁是排他的它会阻塞其他的写锁和读锁。从颗粒度来区分可以分为表锁和行锁两种。表锁会锁定整张表并且阻塞其他用户对该表的所有读写操作比如alter修改表结构的时候会锁表。行锁又可以分为乐观锁和悲观锁悲观锁可以通过for update实现乐观锁则通过版本号实现。你能说下事务的基本特性和隔离级别吗事务基本特性ACID分别是原子性指的是一个事务中的操作要么全部成功要么全部失败。一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱假设中间sql执行过程中系统崩溃A也不会损失100块因为事务没有提交修改也就不会保存到数据库。隔离性指的是一个事务的修改在最终提交前对其他事务是不可见的。持久性指的是一旦事务提交所做的修改就会永久保存到数据库中。而隔离性有4个隔离级别分别是read uncommit 读未提交可能会读到其他事务未提交的数据也叫做脏读。用户本来应该读取到id1的用户age应该是10结果读取到了其他事务还没有提交的事务结果读取结果age20这就是脏读。read commit 读已提交两次读取结果不一致叫做不可重复读。不可重复读解决了脏读的问题他只会读取已经提交的事务。用户开启事务读取id1用户查询到age10再次读取发现结果20在同一个事务里同一个查询读取到不同的结果叫做不可重复读。repeatable read 可重复复读这是mysql的默认级别就是每次读取结果都一样但是有可能产生幻读。serializable 串行一般是不会使用的他会给每一行读取的数据加锁会导致大量超时和锁竞争的问题。那ACID靠什么保证的呢A原子性由undo log日志保证它记录了需要回滚的日志信息事务回滚时撤销已经执行成功的sql。C一致性一般由代码层面来保证。I隔离性由MVCC来保证。D持久性由内存redo log来保证mysql修改数据同时在内存和redo log记录这次操作事务提交的时候通过redo log刷盘宕机的时候可以从redo log恢复。那你说说什么是幻读什么是MVCC要说幻读首先要了解MVCCMVCC叫做多版本并发控制实际上就是保存了数据在某个时间节点的快照。我们每行数实际上隐藏了两列创建时间版本号过期(删除)时间版本号每开始一个新的事务版本号都会自动递增。还是拿上面的user表举例子假设我们插入两条数据他们实际上应该长这样。这时候假设小明去执行查询此时current_version3select * from user where id3; 同时小红在这时候开启事务去修改id1的记录current_version4update user set name张三三 where id1; 执行成功后的结果是这样的如果这时候还有小黑在删除id2的数据current_version5执行后结果是这样的。由于MVCC的原理是查找创建版本小于或等于当前事务版本删除版本为空或者大于当前事务版本小明的真实的查询应该是这样select * from user where id3 and create_version3 and (delete_version3 or delete_version is null); 所以小明最后查询到的id1的名字还是张三并且id2的记录也能查询到。这样做是为了保证事务读取的数据是在事务开始前就已经存在的要么是事务自己插入或者修改的。明白MVCC原理我们来说什么是幻读就简单多了。举一个常见的场景用户注册时我们先查询用户名是否存在不存在就插入假定用户名是唯一索引。1、小明开启事务current_version6查询名字为王五的记录发现不存在。2、小红开启事务current_version7插入一条数据结果是这样3、小明执行插入名字王五的记录发现唯一索引冲突无法插入这就是幻读。那你知道什么是间隙锁吗间隙锁是可重复读级别下才会有的锁结合MVCC和间隙锁可以解决幻读的问题。我们还是以user举例假设现在user表有几条记录当我们执行begin; select * from user where age20 for update;begin; insert into user(age) values(10); #成功 insert into user(age) values(11); #失败 insert into user(age) values(20); #失败 insert into user(age) values(21); #失败 insert into user(age) values(30); #失败 只有10可以插入成功那么因为表的间隙mysql自动帮我们生成了区间(左开右闭)。(negative infinity10],(10,20],(20,30],(30,positive infinity) 由于20存在记录所以(10,20](20,30]区间都被锁定了无法插入、删除。如果查询21呢就会根据21定位到(20,30)的区间(都是开区间)。需要注意的是唯一索引是不会有间隙索引的。你们数据量级多大分库分表怎么做的首先分库分表分为垂直和水平两个方式一般来说我们拆分的顺序是先垂直后水平。垂直分库基于现在微服务拆分来说都是已经做到了垂直分库了。垂直分表如果表字段比较多将不常用的、数据较大的等等做拆分。水平分表首先根据业务场景来决定使用什么字段作为分表字段(sharding_key)比如我们现在日订单1000万我们大部分的场景来源于C端我们可以用user_id作为sharding_key数据查询支持到最近3个月的订单超过3个月的做归档处理那么3个月的数据量就是9亿可以分1024张表那么每张表的数据大概就在100万左右。比如用户id为100那我们都经过hash(100)然后对1024取模就可以落到对应的表上了。那分表后的ID怎么保证唯一性的呢因为我们主键默认都是自增的那么分表之后的主键在不同表就肯定会有冲突了。有几个办法考虑设定步长比如1-1024张表我们分别设定1-1024的基础步长这样主键落到不同的表就不会冲突了。分布式ID自己实现一套分布式ID生成算法或者使用开源的比如雪花算法这种。分表后不使用主键作为查询依据而是每张表单独新增一个字段作为唯一主键使用比如订单表订单号是唯一的不管最终落在哪张表都基于订单号作为查询依据更新也一样。分表后非sharding_key的查询怎么处理呢可以做一个mapping表比如这时候商家要查询订单列表怎么办呢不带user_id查询的话你总不能扫全表吧所以我们可以做一个映射关系表保存商家和用户的关系查询的时候先通过商家查询到用户列表再通过user_id去查询。打宽表一般而言商户端对数据实时性要求并不是很高比如查询订单列表可以把订单表同步到离线实时数仓再基于数仓去做成一张宽表再基于其他如es提供查询服务。数据量不是很大的话比如后台的一些查询之类的也可以通过多线程扫表然后再聚合结果的方式来做。或者异步的形式也是可以的。ListCallableListUser taskList  Lists.newArrayList(); for (int shardingIndex  0; shardingIndex  1024; shardingIndex) {taskList.add(() - (userMapper.getProcessingAccountList(shardingIndex))); } ListThirdAccountInfo list  null; try {list  taskExecutor.executeTask(taskList); } catch (Exception e) {//do something }public class TaskExecutor {public T ListT executeTask(Collection? extends CallableT tasks) throws Exception {ListT result  Lists.newArrayList();ListFutureT futures  ExecutorUtil.invokeAll(tasks);for (FutureT future : futures) {result.add(future.get());}return result;} }说说mysql主从同步怎么做的吧首先先了解mysql主从同步的原理master提交完事务后写入binlog。slave连接到master获取binlog。master创建dump线程推送binglog到slave。slave启动一个IO线程读取同步过来的master的binlog记录到relay log中继日志中。slave再开启一个sql线程读取relay log事件并在slave执行完成同步。slave记录自己的binglog。由于mysql默认的复制方式是异步的主库把日志发送给从库后不关心从库是否已经处理这样会产生一个问题就是假设主库挂了从库处理失败了这时候从库升为主库后日志就丢失了。由此产生两个概念。全同步复制主库写入binlog后强制同步日志到从库所有的从库都执行完成后才返回给客户端但是很显然这个方式的话性能会受到严重影响。半同步复制和全同步不同的是半同步复制的逻辑是这样从库写入日志成功后返回ACK确认给主库主库收到至少一个从库的确认就认为写操作完成。那主从的延迟怎么解决呢这个问题貌似真的是个无解的问题只能是说自己来判断了需要走主库的强制走主库查询。更多阅读推荐超详细 | 21张图带你领略集合的线程不安全云起云涌PaaS 体系架构与运维系统上云实践该买哪家二手手机呢程序员爬取京东告诉你苹果秋季发布会于9月16日召开华为搜索业务将在国内亮相Android 11正式版发布 | 极客头条腾讯微博即将关停十年了你用过吗
http://www.yutouwan.com/news/494043/

相关文章:

  • 营销网站建设前期准备做医院网站公司电话
  • 什么是开放式的网站如何识别网页用什么网站做的
  • 佛山自助建站系统html制作个人网页案例
  • 网站后台登陆素材在线图片制作加字生成
  • 发布培训的免费网站模板虚拟主机 网站镜像
  • 网站推广步骤有哪些自己网站建设问题
  • wix做网站竞争对手网站分析
  • 无锡建设网站制作成都家具网站建设
  • 网站备案时核验单苏州 规划建设局网站
  • 国外做西餐的网站打开网站很慢
  • 视频代做网站外包加工网手工活
  • 需要注册的企业网站企业网站建设的劣势
  • 中国贸易网官网手机版曲靖seo建站
  • 网站建设与维护是什么内容网络服务主要包括哪几项
  • 平台营销型网站建设wordpress音乐小工具
  • 做网站需要学会哪些wordpress 轮播图代码
  • 济源网站建设的公司少儿编程加盟店8
  • 哪个网站衬衣做的好如果在阿里云上做自己的网站
  • 公司域名更改 网站怎么做提示一直在做竞价的网站是不是不需要做seo
  • 昆明网站制作费用wordpress设置图标
  • wordpress 双语网站电子商务网站开发实训总结
  • 深圳开发网站开发中国建设银行手机银行网站
  • 珠海网站建设王道下拉強福州思企互联网站建设公司怎么样
  • 山东网站建设网络公司html5做手机网站
  • 个性定制网站有哪些wordpress文件上传
  • 做游戏交易网站有哪些宝安沙井海岸城
  • 网站建设及推广衬胶蝶阀付费做网站关键词优化是怎么做的呀
  • 门户网站产品设计方案wordpress 小程序开发
  • 临武网站建设wordpress前台主题切换
  • 江门做公司网站婚纱摄影网站定制