mysql_index

以下内容基于mysql innodb引擎

索引数据结构

#### B-tree

#### B+tree

索引存储结构

#### 聚集索引

#### 非聚集索引

索引的应用

#### B+索引

#### 自适应hash索引

#### 全文索引

### 为什么是B+ tree

主要考虑两点:磁盘IO次数、区间访问(基于范围的查询)效率

##### 和红黑树对比 在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。在内存中使用改数据结构比较多

#### 和B-tree对比 B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数。但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多)

Mysql 

mysql_conversion

隐式类型转换

数据类型字段

如果以数字开关的,后面的字符将被截断,只取前面的数字值,如果不以数字开关的将被置为0

table表中的columnA字段为int类型

select * from table where columnA='7788Ab'

相当于

select * from table where columnA=7788

select * from table where columnA='Ab7788'

相当于

select * from table where columnA=0

字符类型字段

table表中的columnB字段为varchar类型,且有索引idx_columnB

select * from table where columnB='7788Ab'

可以正常使用索引 而

select * from table where columnB=7788

发生隐式类型转换,不能使用索引

官方规则

  • 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  • 两个参数都是字符串,会按照字符串来比较,不做类型转换
  • 两个参数都是整数,按照整数来比较,不做类型转换
  • 十六进制的值和非数字做比较时,会被当做二进制串
  • 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  • 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  • 所有其他情况下,两个参数都会被转换为浮点数再进行比较
mysql 

consistent_hash

为什么需要一致性hash

算法的理解

http://en.wikipedia.org/wiki/Consistent_hashing

具体实现及应用

Dubbo中一致性Hash的实现:com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance

Motan中一致性Hash的实现:com.weibo.api.motan.cluster.loadbalance.ConsistentHashLoadBalance

Guava中一致性Hash实现:com.google.common.hash.Hashing.consistentHash(*)

threadlocal

ThreadLocal public class RawRunnableTest { @Test public void testRawInheritableThreadLocal() throws InterruptedException { final ThreadLocal<Span> threadLocal = new ThreadLocal<>(); threadLocal.set(new Span("xiexiexie")); //输出 xiexiexie Object o = threadLocal.get(); Runnable runnable = new Runnable() { @Override public void run() { System.out.println(threadLocal.get() + "thead-" + Thread.currentThread()); threadLocal.set(new Span("zhangzhangzhang1")); System.out.println(threadLocal.get() + "thead-" + Thread.currentThread()); } }; Runnable runnable2 = new Runnable() { @Override public void run() { System.out.println(threadLocal.get() + "thead-" + Thread.currentThread()); threadLocal.set(new Span("zhangzhangzhang2")); System. [Read More]

mysql_hint_comment

Mysql 语法

comment

https://dev.mysql.com/doc/refman/5.7/en/comments.html

hint

应用

Cobar中的应用

https://github.com/alibaba/cobar/blob/03c2d08aed913726c14fd9640d928aa9d8edf896/server/src/main/route/com/alibaba/cobar/route/hint/PartitionOperandHintParser.java

https://github.com/alibaba/cobar/blob/03c2d08aed913726c14fd9640d928aa9d8edf896/server/src/main/route/com/alibaba/cobar/route/ServerRouter.java

MyCat中的应用

https://github.com/MyCATApache/Mycat-Server/blob/712518e8ce257f34f71088d0fffb74d40c675a54/src/main/java/io/mycat/route/RouteService.java

可扩展的应用

分布式调用追踪——————业务追踪溯源

Mysql 

so_broadcast

Netty在开发基于udp协议的代码中server段设置的参数broadcast有什么意义?

public static void initServer() {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group)
                    .channel(NioDatagramChannel.class)
                    .option(ChannelOption.SO_BROADCAST, true)
                    .handler(new UdpServerHandler());
            Channel channel = bootstrap.bind(AppConstants.SEARCH_PORT).sync().channel();
            channel.closeFuture().await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            group.shutdownGracefully();
        }
    }

设置SO_BROADCAST选项为0,只接受单播数据报 设置SO_BROADCASE选项为1,接受UDP广播

web容器

web容器有哪些选择

  1. Tomcat
  2. Jetty
  3. Undertow
  4. 基于Netty的**

对比及区别

分析

动态规划

原文转自:http://www.sohu.com/a/153858619_466939

问题

题目1:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

题目二:

有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?

解决思路

TODO

动态规划

  1. 最优子结构

  2. 边界

  3. 状态转移公式

算法