一、web系统开发的优势?
1、可以集中精力在业务的实现,而不用把过多的精力和人力用在代码功能逻辑的实现上。
2、可以避免由我们自己写带来的很多BUG。
3、可以暂时的解决掉某一问题,待以后的进一步解决。
4、可以避免写技术文档和介绍功能实现给团队成员的问题。
5、可以极大的缩短WEB开发的周期。
因为成熟的WEB开发框架本身就是完善的解决方案。一般它们都有自己的生态系统,有众多技术达人参与。
二、web开发和系统开发的区别?
系统开发是根据计算机用户对应用系统的技术要求,分析原系统,设计新的计算机系统的内部结构并加以实现和维护的过程。
Web开发主要是建立在B/S架构模式下,衍生出来的一系列web应用程序,即主要是基于浏览器的应用程序开发,这也是web应用程序开发的基础,比如淘宝、京东、当当网等。
三、web原理?
Web服务器通过HTTP协议进行通信,Web服务器有是也叫HTTP服务器或Web容器,HTTP协议采用的是请求/响应模式,即客户端发起HTTP请求,web服务器接收并解析处理HTTP请求,然后将HTTP响应发送给客户端。
Web服务器指的是一个软件程序,例如Apache Tomcat、Jboos等,它们的作用就是管理Web应用,当客户端发出一个HTTP请求,相应的Web服务器接收HTTP请求后,调用相应的web应用处理请求,然后Web服务器再将响应结果返回给客户端。
四、如何连接web端和mysql?
你这问的太笼统了,你用什么开发你的系统啊,例如用php,先安装个web服务(apache),安装php开发环境,安装mysql数据库,都安装配置好后,你就可以写你的系统了,把写好的系统放在apache下的htdocs目录内,通过ip就可以访问你的网站了
五、mysql 查询原理?
第一步:应用程序把查询SQL语句发给服务器端执行
我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。
第二步:服务器解析请求的SQL语句
1.SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。
第三步:语句执行
服务器对SQL语句解析完成后,服务器才会知道这条语句到底代表了什么意思,接下来才会真正的执行SQL语句。
六、web socket原理?
WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术。WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程。其目的是在WebSocket应用和WebSocket服务器进行频繁双向通信时,可以使服务器避免打开多个HTTP连接进行工作来节约资源,提高了工作效率和资源利用率。
七、mysql最左原则原理?
最左前缀匹配原则,非常重要的原则,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的顺序可以任意调整。
最左匹配原则都是针对联合索引来说的,所以我们可以从联合索引的原理来了解最左匹配原则。
我们都知道索引的底层是一颗 B+ 树,那么联合索引当然还是一颗 B+ 树,只不过联合索引的键值数量不是一个,而是多个。构建一颗 B+ 树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建 B+ 树。
八、mysql索引底层原理?
一、定义
索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。本质:索引是数据结构。
二、B-Tree
m阶B-Tree满足以下条件:1、每个节点至多可以拥有m棵子树。2、根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶,也是树)。3、非根非叶的节点至少有的Ceil(m/2)个子树(Ceil表示向上取整,如5阶B树,每个节点至少有3个子树,也就是至少有3个叉)。4、非叶节点中的信息包括[n,A0,K1,A1,K2,A2,…,Kn,An],,其中n表示该节点中保存的关键字个数,K为关键字且Ki<Ki+1,A为指向子树根节点的指针。5、从根到叶子的每一条路径都有相同的长度(叶子节点在相同的层)
B-Tree特性:
1、关键字集合分布在整颗树中;2、任何一个关键字出现且只出现在一个节点中;3、每个节点存储date和key;4、搜索有可能在非叶子节点结束;5、一个节点中的key从左到右非递减排列;6、所有叶节点具有相同的深度,等于树高h。
B-Tree上查找算法的伪代码如下:
三、B+Tree
B+Tree与B-Tree的差异在于:1、B+Tree非叶子节点不存储data,只存储key;2、所有的关键字全部存储在叶子节点上;3、每个叶子节点含有一个指向相邻叶子节点的指针,带顺序访问指针的B+树提高了区间查找能力;4、非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字;
四、B/B+树索引的性能分析
依据:使用磁盘I/O次数评价索引结构的优劣主存和磁盘以页为单位交换数据,将一个节点的大小设为等于一个页,因此每个节点只需一次I/O就可以完全载入。根据B树的定义,可知检索一次最多需要访问h个节点渐进复杂度:O(h)=O(logdN) dmax=floor(pagesize/(keysize+datasize+pointsize))一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3,3层可存大约一百万数据)B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存)B+Tree内节点不含data域,因此出度d更大,则h更小,I/O次数少,效率更高,故B+Tree更适合外存索引。
五、MySQL索引实现1、MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址; MyISAM主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复;
2、InnoDB的数据文件本身就是索引文件,叶节点包含了完整的数据记录,这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。 InnoDB的辅助索引data域存储相应记录主键的值而不是地址; 辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录;
3、页分裂问题
如果主键是单调递增的,每条新记录会顺序插入到页,当页被插满后,继续插入到新的页;
如果写入是乱序的,InnoDB不得不频繁地做页分裂操作,以便为新的行分配空间。页分裂会导致移动大量数据,一次插入最少需要修改三个页而不是一个页。
如果频繁的页分裂,页会变得稀疏并被不规则地填充,所以最终数据会有碎片。
六、总结
了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助
1、为什么不建议使用过长的字段作为主键?
2、为什么选择自增字段作为主键?
3、为什么常更新是字段不建议建立索引?
4、为什么选择区分度高的列作为索引?区分度的公式是count(distinct col)/count(*)
5、尽可能的使用覆盖索引
七、优化LIMIT分页查询
SELECT * FROM table where condition LIMIT offset , rows ;上述SQL语句的实现机制是: 1、从“table”表中读取offset+rows行记录。 2、 抛弃前面的offset行记录,返回后面的rows行记录作为最终的结果。覆盖索引:select a.id, sid, parent_s_id from cashpool_account_relationship a join (select id from cashpool_account_relationship LIMIT 1000000,10)b on a.id = b.id;select id, sid, parent_s_id from cashpool_account_relationship where id >=(select id from cashpool_account_relationship LIMIT 1000000,1) LIMIT 10;
八、Q&A
1、InnoDB支持hash索引吗?--马欣InnoDB是支持hash索引的,不过其支持的hash索引是自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成hash索引,不能人为干预是否在一张表中生成hash索引。2、InnoDB主键索引的叶节点含完整的数据记录,那主键索引文件要比数据文件大吗?--徐财厚1).在Innodb 引擎中,主键索引中的叶子结点包含记录数据,主键索引文件即为数据文件。2).在 tables 表中统计的data_length数据为主键索引大小,index_length 为统计的这个表中所有辅助索引(二级索引)索引的大小。
九、mysql持久化原理?
持久化定义
持久化是指事务一旦提交,它对数据库的改变就应该是永久性的,接下来的其他操作或故障不应该对本次事务的修改有任何影响。
我们知道InnoDB使用 Buffer Pool 来提高读写的性能。但是 Buffer Pool 是在内存的,是易失性的,如果一个事务提交了事务后,MySQL突然宕机,且此时Buffer Pool中修改的数据还没有刷新到磁盘中的话,就会导致数据的丢失,事务的持久性就无法保证。
为了解决这个问题,InnoDB引入了 redo log来实现数据修改的持久化。当数据修改时,InnoDB除了修改Buffer Pool中的数据,还会在redo log 记录这次操作,并保证redo log早于对应的页面落盘(一般在事务提交的时候),也就是常说的WAL。若MySQL突然宕机了且还没有把数据刷回磁盘,重启后,MySQL会通过已经写入磁盘的redo log来恢复没有被刷新到磁盘的数据页。
实现原理:redo log
为了提高性能,和数据页类似,redo log 也包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。redo log是物理日志,记录的是数据库中物理页的情况 。
当数据发生修改时,InnoDB不仅会修改Buffer Pool中的数据,也会在redo log buffer记录这次操作;当事务提交时,会对redo log buffer进行刷盘,记录到redo log file中。如果MySQL宕机,重启时可以读取redo log file中的数据,对数据库进行恢复。这样就不需要每次提交事务都实时进行刷脏了。
大概就是这些,还有就是出现意外关机,需要数据恢复的,持久化这块也可以做到的。
十、mysql回表原理?
Mysql回表指的是在InnoDB存储引擎下,二级索引查询到的索引列,如果需要查找所有列的数据,则需要到主键索引里面去取出数据。这个过程就称为回表。因为行的数据都是存在主键B+tree的叶子节点里面,二级索引的B+树叶子节点都是存放的(索引列,主键)。
- 相关评论
- 我要评论
-