explain执行计划中type列中有几个类型及含义?
依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL,一般来说,得保证查询达到range级别,最好到达ref。
const:用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
system:system是const的特例,表里只有一条元组匹配时为 system
eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。
ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
range:范围扫描通常出现在 in(), between ,> ,= 等操作中。使用一个索引来检索给定范围的行
index:扫描全表索引,这通常比ALL快一些。
ALL:即全表扫描 ,意味着mysql需要从头到尾去查找所需要的行。通常情况下这需要增加索 引来进行优化了
连接池怎么设置?
1、如何设置连接池大小
一个请求的耗时为5ms ,每个连接1秒能处理的请求数量是200个,如果需要支持2000并发,那么理论上的连接数为10个。
minIdle:最小连接数 统计 QPS 和 请求响应时间的平均值,以此计算 minIdle,并设置 initialSize = minIdle。
推荐配置:5 maxActive :最大连接池数量,允许的最大同时使用中的连接数。
统计峰值时的 QPS 和此时的请求响应时间,以此计算 maxActive。实际需要比计算值略大一些。
配置 maxActive 千万不要好大喜多,虽然配置大了看起来业务流量飙升后还能处理更多的请求,但切换到DB视角会发现其实连接数的增多在很多场景下反而会减低吞吐量,一个非常典型的例子就秒杀,在更新热点数据时DB 需要加锁操作,这个时候再让更多的连接操作DB 就有点像假日往高速上涌入的车辆,只会给DB添堵。
推荐配置:20,多数场景下 20 已完全够用,当然这个参数跟使用场景相关性很大,一般配置成正常连接数的3~5倍。
maxWait:从连接池获取连接的超时等待时间,单位毫秒。 需要注意这个参数只管理获取连接的超时。获取连接等待的直接原因是池子里没有可用连接,具体包括:连接池未初始化,连接长久未使 用已被释放,连接使用中需要新建连接,或连接池已耗尽需等待连接用完后归还。这里有一个很关键的点是 maxWait 未配置或者配置为 0 时,表示不设等待超时时间。如果不配置maxWait,当突发大流量涌入时,造成连接池耗尽,所有新增的DB请求处于等待获取连接的状 态中,在请求速度大于处理速度的情况下等待队列会越排越长,最终业务上的表现就是业务接口大量超时,流量越大造成实际吞吐量反而越低。
推荐配置:内网(网络状况好)800;网络状况不是特别好的情况下推荐大于等于 1200
...............待续