索引相关
关于MySQL的索引,曾经进⾏过⼀次总结,⽂章链接在这⾥ Mysql索引原理及其优化.
1. 什么是索引?
索引是⼀种数据结构,可以帮助我们快速的进⾏数据的查找.
2. 索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在MySQL中使⽤较多的索引有Hash索引,B+树索引等,⽽我们经常使⽤的InnoDB存储
引擎的默认索引实现为:B+树索引.
3. Hash索引和B+树所有有什么区别或者说优劣呢?
⾸先要知道Hash索引和B+树索引的底层实现原理:
hash索引底层就是hash表,进⾏查找时,调⽤⼀次hash函数就可以获取到相应的键值,之后进⾏回表查询获得实际数据.B+树底层实
现是多路平衡查找树.
对于每⼀次的查询都是从根节点出发,查找到叶⼦节点⽅可以获得所查键值,然后根据查询判断是否需要回表查询数据.
那么可以看出他们有以下的不同:
hash索引进⾏等值查询更快(⼀般情况下),但是却⽆法进⾏范围查询.
因为在hash索引中经过hash函数建⽴索引之后,索引的顺序与原顺序⽆法保持⼀致,不能⽀持范围查询.
⽽B+树的的所有节点皆遵循(左节点⼩于⽗节点,右节点⼤于⽗节点,多叉树也类似),天然⽀持范围.
hash索引不⽀持使⽤索引进⾏排序,原理同上.
hash索引不⽀持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关
性.
hash索引任何时候都避免不了回表查询数据,⽽B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询.
hash索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某个键值存在⼤量重复的时候,发⽣hash碰撞,此时效率可能极
差.⽽B+树的查询效率⽐较稳定,对于所有的查询都是从根节点到叶⼦节点,且树的⾼度较低.
因此,在⼤多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度.⽽不需要使⽤hash索引.
4. 上⾯提到了B+树在满⾜聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?
在B+树的索引中,叶⼦节点可能存储了当前的key值,也可能存储了当前的key值以及整⾏的数据,这就是聚簇索引和⾮聚簇索引.
在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选⼀个唯⼀键建⽴聚簇索引.如果没有唯⼀键,则隐式的⽣成⼀个键来建
⽴聚簇索引.
当查询使⽤聚簇索引时,在对应的叶⼦节点,可以获取到整⾏数据,因此不⽤再次进⾏回表查询.
5. ⾮聚簇索引⼀定会回表查询吗?
不⼀定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进⾏回表查询.
举个简单的例⼦,假设我们在员⼯表的年龄上建⽴了索引,那么当进⾏select age from employee where age < 20 的查询时,在索
引的叶⼦节点上,已经包含了age信息,不会再次进⾏回表查询.
6. 在建⽴索引的时候,都有哪些需要考虑的因素呢?
建⽴索引的时候⼀般要考虑到字段的使⽤频率,经常作为条件进⾏查询的字段⽐较适合.如果需要建⽴联合索引的话,还需要考虑联
合索引中的顺序.
此外也要考虑其他⽅⾯,⽐如防⽌过多的所有对表造成太⼤的压⼒.这些都和实际的表结构以及查询⽅式有关.
7. 联合索引是什么?为什么需要注意联合索引中的顺序?
MySQL可以使⽤多个字段同时建⽴⼀个索引,叫做联合索引.在联合索引中,如果想要命中索引,需要按照建⽴索引时的字段顺序挨个
使⽤,否则⽆法命中索引.
具体原因为:
MySQL使⽤索引时需要索引有序,假设现在建⽴了"name,age,school"的联合索引
那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进⾏排序.
当进⾏查询时,此时索引仅仅按照name严格有序,因此必须⾸先使⽤name字段进⾏等值查询,之后对于匹配到的列⽽⾔,其按照age
字段严格有序,此时可以使⽤age字段⽤做索引查找,以此类推.
因此在建⽴联合索引的时候应该注意索引列的顺序,⼀般情况下,将查询需求频繁或者字段选择性⾼的列放在前⾯.此外可以根据特
例的查询或者表结构进⾏单独的调整.
8. 创建的索引有没有被使⽤到?或者说怎么才可以知道这条语句运⾏很慢的原因?
MySQL提供了explain命令来查看语句的执⾏计划,MySQL在执⾏某个语句之前,会将该语句过⼀遍查询优化器,之后会拿到对语句
的分析,也就是执⾏计划,其中包含了许多信息.
可以通过其中和索引有关的信息来分析是否命中了索引,例如possilbe_key,key,key_len等字段,分别说明了此语句可能会使⽤的
索引,实际使⽤的索引以及使⽤的索引⻓度.
9. 那么在哪些情况下会发⽣针对该列创建了索引但是在查询的时候并没有使⽤呢?
使⽤不等于查询
列参与了数学运算或者函数
在字符串like时左边是通配符.类似于'%aaa'.
当mysql分析全表扫描⽐使⽤索引快的时候不使⽤索引.
当使⽤联合索引,前⾯⼀个条件为范围查询,后⾯的即使符合最左前缀原则,也⽆法使⽤索引.
以上情况,MySQL⽆法使⽤索引.
事务相关
1. 什么是事务?
理解什么是事务最经典的就是转账的栗⼦,相信⼤家也都了解,这⾥就不再说⼀边了.
事务是⼀系列的操作,他们要符合ACID特性.最常⻅的理解就是:事务中的操作要么全部成功,要么全部失败.但是只是这样还不够的.
2. ACID是什么?可以详细说⼀下吗?
A=Atomicity
原⼦性,就是上⾯说的,要么全部成功,要么全部失败.不可能只执⾏⼀部分操作.
C=Consistency
系统(数据库)总是从⼀个⼀致性的状态转移到另⼀个⼀致性的状态,不会存在中间状态.
I=Isolation
隔离性: 通常来说:⼀个事务在完全提交之前,对其他事务是不可⻅的.注意前⾯的通常来说加了红⾊,意味着有例外情况.
D=Durability
持久性,⼀旦事务提交,那么就永远是这样⼦了,哪怕系统崩溃也不会影响到这个事务的结果.
3. 同时有多个事务在进⾏会怎么样呢?
多事务的并发进⾏⼀般会造成以下⼏个问题:
脏读: A事务读取到了B事务未提交的内容,⽽B事务后⾯进⾏了回滚.
不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不⼀样,因为在此期间B事务
进⾏了提交操作.
幻读: A事务读取了⼀个范围的内容,⽽同时B事务在此期间插⼊了⼀条数据.造成"幻觉".
4. 怎么解决这些问题呢?MySQL的事务隔离级别了解吗?
MySQL的四种隔离级别如下:
未提交读(READ UNCOMMITTED)
这就是上⾯所说的例外情况了,这个隔离级别下,其他事务可以看到本事务没有提交的部分修改.因此会造成脏读的问题(读取到了其
他事务未提交的部分,⽽之后该事务进⾏了回滚).
这个级别的性能没有⾜够⼤的优势,但是⼜有很多的问题,因此很少使⽤.
已提交读(READ COMMITTED)
其他事务只能读取到本事务已经提交的部分.这个隔离级别有 不可重复读的问题,在同⼀个事务内的两次读取,拿到的结果竟然不⼀
样,因为另外⼀个事务对数据进⾏了修改.
REPEATABLE READ(可重复读)
可重复读隔离级别解决了上⾯不可重复读的问题(看名字也知道),但是仍然有⼀个新问题,就是幻读
当你读取id> 10 的数据⾏时,对涉及到的所有⾏加上了读锁,此时例外⼀个事务新插⼊了⼀条id=11的数据,因为是新插⼊的,所以不
会触发上⾯的锁的排斥
那么进⾏本事务进⾏下⼀次的查询时会发现有⼀条id=11的数据,⽽上次的查询操作并没有获取到,再进⾏插⼊就会有主键冲突的问
题.
SERIALIZABLE(可串⾏化)
这是最⾼的隔离级别,可以解决上⾯提到的所有问题,因为他强制将所以的操作串⾏执⾏,这会导致并发性能极速下降,因此也不是很
常⽤.
5. Innodb使⽤的是哪种隔离级别呢?
InnoDB默认使⽤的是可重复读隔离级别.
6. 对MySQL的锁了解吗?
当数据库有并发事务的时候,可能会产⽣数据的不⼀致,这时候需要⼀些机制来保证访问的次序,锁机制就是这样的⼀个机制.
就像酒店的房间,如果⼤家随意进出,就会出现多⼈抢夺同⼀个房间的情况,⽽在房间上装上锁,申请到钥匙的⼈才可以⼊住并且将房
间锁起来,其他⼈只有等他使⽤完毕才可以再次使⽤.
7. MySQL都有哪些锁呢?像上⾯那样⼦进⾏锁定岂不是有点阻碍并发效率了?
从锁的类别上来讲,有共享锁和排他锁.
共享锁: ⼜叫做读锁. 当⽤⼾要进⾏数据的读取时,对数据加上共享锁.共享锁可以同时加上多个.
排他锁: ⼜叫做写锁. 当⽤⼾要进⾏数据的写⼊时,对数据加上排他锁.排他锁只可以加⼀个,他和其他的排他锁,共享锁都相斥.
⽤上⾯的例⼦来说就是⽤⼾的⾏为有两种,⼀种是来看房,多个⽤⼾⼀起看房是可以接受的. ⼀种是真正的⼊住⼀晚,在这期间,⽆论是
想⼊住的还是想看房的都不可以.
锁的粒度取决于具体的存储引擎,InnoDB实现了⾏级锁,⻚级锁,表级锁.
他们的加锁开销从⼤⼤⼩,并发能⼒也是从⼤到⼩.
表结构设计
1. 为什么要尽量设定⼀个主键?
主键是数据库确保数据⾏在整张表唯⼀性的保障,即使业务上本张表没有主键,也建议添加⼀个⾃增⻓的ID列作为主键.
设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.
2. 主键使⽤⾃增ID还是UUID?
推荐使⽤⾃增ID,不要使⽤UUID.
因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的
也就是说,主键索引的B+树叶⼦节点上存储了主键索引以及全部的数据(按照顺序)
如果主键索引是⾃增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的⼤⼩不确定,会造成⾮常多的数据插⼊,
数据移动,然后导致产⽣很多的内存碎⽚,进⽽造成插⼊性能的下降.
总之,在数据量⼤⼀些的情况下,⽤⾃增主键性能会好⼀些.
图⽚来源于《⾼性能MySQL》: 其中默认后缀为使⽤⾃增ID,_uuid为使⽤UUID为主键的测试,测试了插⼊100w⾏和300w⾏的性能.
关于主键是聚簇索引,如果没有主键,InnoDB会选择⼀个唯⼀键来作为聚簇索引,如果没有唯⼀键,会⽣成⼀个隐式的主键.
If you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index.
If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as
the primary key and InnoDB uses it as the clustered index.
3. 字段为什么要求定义为not null?
MySQL官⽹这样介绍:
NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL
columntakes one bit extra, rounded up to the nearest byte.
null值会占⽤更多的字节,且会在程序中造成很多与预期不符的情况.
4. 如果要存储⽤⼾的密码散列,应该使⽤什么字段进⾏存储?
密码散列,盐,⽤⼾⾝份证号等固定⻓度的字符串应该使⽤char⽽不是varchar来存储,这样可以节省空间且提⾼检索效率.
存储引擎相关
1. MySQL⽀持哪些存储引擎?
MySQL⽀持多种存储引擎,⽐如InnoDB,MyISAM,Memory,Archive等等.
在⼤多数的情况下,直接选择使⽤InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎.
1. InnoDB和MyISAM有什么区别?
InnoDB⽀持事物,⽽MyISAM不⽀持事物
InnoDB⽀持⾏级锁,⽽MyISAM⽀持表级锁
InnoDB⽀持MVCC, ⽽MyISAM不⽀持
InnoDB⽀持外键,⽽MyISAM不⽀持
InnoDB不⽀持全⽂索引,⽽MyISAM⽀持。
零散问题
1. MySQL中的varchar和char有什么区别.
char是⼀个定⻓字段,假如申请了char(10) 的空间,那么⽆论实际存储多少内容.该字段都占⽤10个字符,⽽varchar是变⻓的
也就是说申请的只是最⼤⻓度,占⽤的空间为实际字符⻓度+1,最后⼀个字符存储使⽤了多⻓的空间.
在检索效率上来讲,char > varchar,因此在使⽤中,如果确定某个字段的值的⻓度,可以使⽤char,否则应该尽量使⽤varchar.例如存
储⽤⼾MD5加密后的密码,则应该使⽤char.
2. varchar(10)和int(10)代表什么含义?
varchar的10代表了申请的空间⻓度,也是可以存储的数据的最⼤⻓度,⽽int的10只是代表了展⽰的⻓度,不⾜10位以0填充.
也就是说,int(1)和int(10)所能存储的数字⼤⼩以及占⽤的空间都是相同的,只是在展⽰时按照⻓度展⽰.
3. MySQL的binlog有有⼏种录⼊格式?分别有什么区别?
有三种格式,statement,row和mixed.
statement模式下,记录单元为语句.即每⼀个sql造成的影响会记录.由于sql的执⾏是有上下⽂的,因此在保存的时候需要保存
相关的信息,同时还有⼀些使⽤了函数之类的语句⽆法被记录复制.
row级别下,记录单元为每⼀⾏的改动,基本是可以全部记下来但是由于很多操作,会导致⼤量⾏的改动(⽐如alter table),因此
这种模式的⽂件保存的信息太多,⽇志量太⼤.
mixed. ⼀种折中的⽅案,普通操作使⽤statement记录,当⽆法使⽤statement的时候使⽤row.
此外,新版的MySQL中对row级别也做了⼀些优化,当表结构发⽣变化的时候,会记录语句⽽不是逐⾏记录.
4. 超⼤分⻚怎么处理?
超⼤的分⻚⼀般从两个⽅向上来解决.
数据库层⾯,这也是我们主要集中关注的(虽然收效没那么⼤)
类似于select * from table where age > 20 limit 1000000,10 这种查询其实也是有可以优化的余地的.
这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然⽐较慢.
我们可以修改为select * from table where id in (select id from table where age > 20 limit 1000000,10)
这样虽然也load了⼀百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快.
同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10 ,效率也是不错的
优化的可能性有许多种,但是核⼼思想都⼀样,就是减少load的数据.
从需求的⻆度减少这种请求….主要是不做类似的需求(直接跳转到⼏百万⻚之后的具体某⼀⻚.只允许逐⻚查看或者按照给定
的路线⾛,这样可预测,可缓存)以及防⽌ID泄漏且连续被⼈恶意攻击.
解决超⼤分⻚,其实主要是靠缓存,可预测性的提前查到内容,缓存⾄redis等k-V数据库中,直接返回即可.
在阿⾥巴巴《Java开发⼿册》中,对超⼤分⻚的解决办法是类似于上⾯提到的第⼀种.
5. 关⼼过业务系统⾥⾯的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
在业务系统中,除了使⽤主键进⾏的查询,其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢
查询反馈给我们.
慢查询的优化⾸先要搞明⽩慢的原因是什么? 是查询条件没有命中索引?是load了不需要的数据列?还是数据量太⼤?
所以优化也是针对这三个⽅向来的,
⾸先分析语句,看看是否load了额外的数据,可能是查询了多余的⾏并且抛弃掉了,可能是加载了许多结果中并不需要的列,对
语句进⾏分析以及重写.
分析语句的执⾏计划,然后获得其使⽤索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引.
如果对语句的优化已经⽆法进⾏,可以考虑表中的数据量是否太⼤,如果是的话可以进⾏横向或者纵向的分表.
6. 上⾯提到横向分表和纵向分表,可以分别举⼀个适合他们的例⼦吗?
横向分表是按⾏分表.假设我们有⼀张⽤⼾表,主键是⾃增ID且同时是⽤⼾的ID.数据量较⼤,有1亿多条,那么此时放在⼀张表⾥的查
询效果就不太理想.
我们可以根据主键ID进⾏分表,⽆论是按尾号分,或者按ID的区间分都是可以的.
假设按照尾号0-99分为100个表,那么每张表中的数据就仅有100w.这时的查询效率⽆疑是可以满⾜要求的.
纵向分表是按列分表.假设我们现在有⼀张⽂章表.包含字段id-摘要-内容.⽽系统中的展⽰形式是刷新出⼀个列表,列表中仅包含标
题和摘要
当⽤⼾点击某篇⽂章进⼊详情时才需要正⽂内容.此时,如果数据量⼤,将内容这个很⼤且不经常使⽤的列放在⼀起会拖慢原表的查
询速度.
我们可以将上⾯的表分为两张. id-摘要, id-内容.当⽤⼾点击详情,那主键再来取⼀次内容即可.⽽增加的存储量只是很⼩的主键字
段.代价很⼩.
当然,分表其实和业务的关联度很⾼,在分表之前⼀定要做好调研以及benchmark.不要按照⾃⼰的猜想盲⽬操作.
7. 什么是存储过程?有哪些优缺点?
存储过程是⼀些预编译的SQL语句。
1、更加直⽩的理解:存储过程可以说是⼀个记录集,它是由⼀些T-SQL语句组成的代码块
这些T-SQL语句代码像⼀个⽅法⼀样实现⼀些功能(对单表或多表的增删改查),然后再给这个代码块取⼀个名字,在⽤到这个
功能的时候调⽤他就⾏了。
2、存储过程是⼀个预编译的代码块,执⾏效率⽐较⾼,⼀个存储过程替代⼤量T_SQL语句 ,可以降低⽹络通信量,提⾼通信速率,
可以⼀定程度上确保数据安全
但是,在互联⽹项⽬中,其实是不太推荐存储过程的,⽐较出名的就是阿⾥的《Java开发⼿册》中禁⽌使⽤存储过程
我个⼈的理解是,在互联⽹项⽬中,迭代太快,项⽬的⽣命周期也⽐较短,⼈员流动相⽐于传统的项⽬也更加频繁
在这样的情况下,存储过程的管理确实是没有那么⽅便,同时,复⽤性也没有写在服务层那么好.
8. 说⼀说三个范式
第⼀范式: 每个列都不可以再拆分.
第⼆范式: ⾮主键列完全依赖于主键,⽽不能是依赖于主键的⼀部分.
第三范式: ⾮主键列只依赖于主键,不依赖于其他⾮主键.
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有⾜够的理由.⽐如性能. 事实上我们经常会为了性能⽽妥协数据库的
设计.
9. MyBatis 中的 #
乱⼊了⼀个奇怪的问题…..我只是想单独记录⼀下这个问题,因为出现频率太⾼了.
# 会将传⼊的内容当做字符串,⽽$会直接将传⼊值拼接在sql语句中.
所以#可以在⼀定程度上预防sql注⼊攻击.

MySQL灵魂100问相关推荐

  1. 吊打面试官!MySQL灵魂100问,你能答出多少?

    推荐阅读: 面试机会不等人,资料看精不看多!史上最全Java技术资料合集! 2019年中总结,400道一线大厂高频精选面试题合集(JVM+Spring+RabbitMQ+Mybatis+Redis+分 ...

  2. 吊打面试官!MySQL和Oracle灵魂100问,你能答出多少?

    内容简介: mysql部分: 一.数据据基本概念 二.Mysql经典例题20道 Oracle部分: 一.Oracle经典例题50道 二.Oracle相关概念 前言 本文'主要受众为开发人员,所以不涉及 ...

  3. MySQL 高频 100 问

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下My ...

  4. MySQL 灵魂 16 问,你能撑到第几问?

    前言 MySQL 在面试中经常被问到,本文总结了面试中的经典问题. ⛳️ 1.数据库三大范式是什么? ⛳️ 2.mysql 有关权限的表都有哪几个? ⛳️ 3. 事务的四大特性(ACID)介绍一下? ...

  5. 【MySql】100问

    主要包括索引,事务,优化等方面. 事务相关 1. 什么是事务? 理解什么是事务最经典的就是转账的栗子,相信大家也都了解,这里就不再说一边了. 事务是一系列的操作,他们要符合ACID特性.最常见的理解就 ...

  6. MySQL经典100问

    目录 常规篇 1.说一下数据库的三大范式? 2.只查询一条数据,但是也执行非常慢,原因一般有哪些? 3.count(*).count(0).count(id)实现方式的区别? 4.误删数据怎么办? 5 ...

  7. MySQL面试100问

    面试官:"了解MySQL吗?" 要是说不了解,接下来该聊些啥呀? 面试官:"了解的话,那说说XXX吧." 巴拉巴拉- MySQL有哪些常见的引擎,说说他们的区别 ...

  8. [灵魂拷问]MySQL面试高频100问(工程师方向)

    前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...

  9. 写给程序员的 MySQL 面试高频 100 问,看完吊打面试官!

    点击上方"五分钟学算法",选择"星标"公众号 重磅干货,第一时间送达 来源 | juejin.im/post/5d351303f265da1bd30596f9 ...

最新文章

  1. antirecall怎么打开_QQ/微信防撤回工具 — Anti recall
  2. 遇到的仍未学习的各种结论
  3. 2022年软件测试工具大全(自动化、接口、性能、安全、测试管理)
  4. ubuntu 9.10安装jdk1.5
  5. 安徽大学java期末_安微大学2017~2018年度期末考试题卷
  6. 如何在TP-LINk WR340G中禁用端口
  7. 黑莓 7290 快捷键
  8. 如何开好一个软件类周会和周报
  9. python pytz_python pytz是什么
  10. mysql 外文翻译5000字_MySQL数据库管理外文翻译.doc
  11. stc单片机“全自动下载”(程序版)
  12. EasyExcel工具类(开箱即用)
  13. macM1芯片通过第三方安装php
  14. 实体店运用互联网思维进行客户裂变,不到8个月净赚2000万
  15. 重大调整!高速限速标准将不再是120km/h
  16. 写给所有默默支持我们这些IT人的另一半------携手看夕阳
  17. DXP封装中如何实现开孔
  18. 区块链多方计算 人工智能学习笔记
  19. 基于matlab的数字图像边缘检测算法研究,基于MATLAB数字图像边缘检测算法的研究与对比分析...
  20. Python爬全国邮政编码的程序

热门文章

  1. 新版本华为交换机开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)
  2. 微信小程序 form表单 开关 多选 单选 输入框 提交
  3. 刘仪伟经典语录摘(转载)
  4. 调侃python的段子_一句话的精辟搞笑段子【幽默调侃的句子】
  5. Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 2.2 Spring Cloud Eureka 进阶
  6. Java使用BigDecimal 比较大小
  7. Java Web入门之JSP的基本语法解析及实战(超详细 附源码)
  8. VMware安装Vista虚拟机
  9. Visual Studio 2015发布以及ASP.NET 5路线图
  10. 用英文单词模拟数学计算