java知识汇总
核心篇
数据存储
-
MySQL 索引使用的注意事项
insert和update语句在拥有索引的表中执行会花费更多的时间,而select语句会执行的更快 唯一索引:不可以出现相同的值,可以有null一般是id字段 普通索引:允许出现相同的索引内容 主键索引:不允许出现相同的值 全文索引:可以针对值中的某个单词,但效率很低 组合索引: 将多个字段建到一个索引里,列值的组合必须唯一 使用alter table name add index name (字段名) 1.索引不会包含有null的列,只要列中有null值,都将不会被包含在索引中,复合索引只要有一列含有null 那么这一列对此复合索引就是无效的 2.使用短索引 某个char的列,前10个或者20个字符内多数值是唯一的,那么久不要对整个列进行索引 短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作 3.索引列排序,mysql查询只使用一个索引,如果where后使用了索引的话,order by中的列是不会使用 索引的 4.like语句 like'%aa%'不会使用索引,而like'aa%'会使用索引 5.不要在列上进行运算操作 6.不使用NOT IN,<>,!=操作,但是<,<=,=,>,>=,BETWEEN,IN是可以用到索引的 7.索引要建在经常select的字段上 增加索引会影响系统的维护速度 8.索引要建在值比较唯一的字段上 9.在where和join中出现的列需要建立索引 10.mysql的where后使用不等于或者函数将无法使用索引 -
说说反模式设计
反模式就是让我们系统恶化的场景总结,数据库优化的时候首先关注的就是long sql,、 long sql 会长时间占用一个connection,如果long sql多了就会将连接耗尽 为了降低响应时间,系统往往在本地内存中缓存很多数据,缓存数据越多命中率就越高, 平均响应时间就越快,为了降低平均响应时间,有些开发者会不加限制的缓存各种数据, 在正常流量情况下,系统的响应时间和吞吐量都有很大改进。但当流量高峰来临时,系 统内存使用开始增多,触发jvm进行full GC进而导致大量缓存被释放,而大量请求又使 得缓存被迅速填满,这就是反复缓存,导致了频繁的full GC -
说说分库与分表设计
-
分库与分表带来的分布式困境与应对之策
避免联合查询,通过在程序中拼装或者通过反范式化设计进行规避 分页和排序问题,将不同分表的返回结果集进行汇总和再排序 分布式事务问题,保证数据一致性 分库与分表主要用于两个场景:海量数据和高并发 建议:结合实际需求,不宜过度设计,在项目一开始不采用分库与分表设计,而是随着业务增长 无法继续优化的情况下再考虑分库和分表 -
说说 SQL 优化之道
1.使用explain判断sql是否合理使用索引,尽量避免extra列出现 2.必须被索引 update,delete的where条件列,order by,group by ,distinct字段 以及多表join字段 3.避免在where字句中对字段进行null值判断,也不要对字段进行表达式操作,这样会让 引擎放弃索引而进行全表扫描 4.避免like使用%前导查询,无法利用索引,避免使用or -
MySQL 遇到的死锁问题
mysql三种锁的级别:页级,表级和行级 表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突概率高,并发度低 行级锁:开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突概率低,并发度高 -
存储引擎的 InnoDB 与 MyISAM
前者支持事务,后者不支持 前者适合执行大量的insert或者update,后者适合大量的select 前者不会保存表的具体行数,需要扫描表来计算后者会保存 前者有表锁和行锁,后者只有表锁 前者清空表是一行行删除,效率慢,后者则会重建表 -
数据库索引的原理
索引是帮助mysql高效获取数据的数据结构 mysql普遍采用B+tree来实现其索引结构 -
为什么要用 B-tree
-
聚集索引与非聚集索引的区别
-
limit 20000 加载很慢怎么解决
-
选择合适的分布式主键方案
-
选择合适的数据存储方案
-
ObjectId 规则
-
聊聊 MongoDB 使用场景
-
倒排索引
-
聊聊 ElasticSearch 使用场景