如果实际生产有5台服务器,连接数是200,每台连接数一般 40 比较合适

    关于自增主键的问题,如果是单体项目没问题,
    如果是分布式系统,就不能主键id,比如换成雪花算法生成id做主键,就保证了全局唯一性,但是这样做不到递增,有什么别的方法?
    (1)针对主库单节点数据库多master节点 提升写性能和高可用的话可以每个master分配初始化值后master节点个数当id自增步长
    (2)redis 来生成全局的业务id比如订单号=日期+当日自增张号 每天弄一个日期的key 然后自增,缺点是 系统复杂度变高
    (3)snowflak 在单节点的时候生成id是按时间递增的,多节点可能不递增或者时钟回拨导致,建议一般主键自增用全局id当业务id
    snowflak解决时钟回拨问题::https://www.jianshu.com/p/98c202f64652


    union 和 union all 区别:
    union 要进行重复值扫描,所以效率低。如何合并并没有刻意要删除重复行,那么就使用union all 两个要联合的SQL语句字段个数
    必须一样,而且字段类型要一致;
    如果我们需要将两个select语句的结果作为一个整体显示出来,就需要用到union或者union all关键字,union的作用是将多个结果合并在一起显示出来。

    union和union all区别,union会自动压缩多个结果集中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
    Union:对两个结果集进行并集合作,不包括重复行,同时进行默认规则的排序;
    Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

    例如:
    select employee_id,job_id from employees union select employee_id,job_id from job_history
    以上将两个表的结果联合在一起,这两个例子会将两个select语句的结果中的重复值进行压缩,也就是结果的数据并不是两条结果的条数的和,如果希望重复行显示出来可以使用union all;

    注意点:
    (1)union 和 union all都可以将多个结果集合并,而不仅仅是两个,可以将结果集串起来。
    (2)使用union和union all必须保证各个select集合的结果有相同个数的列,并且每个列的类型都是一样的。但是列名则不一定
    需要相同,oracle会将第一个结果的列名作为结果集的列名

    DERIVED:表示派生表
    物化表 <—-> 临时表
    exists 判断是否存在,返回true或者false,为true才进行主查询。in是多值匹配,就是可以匹配到具体的值的查询。



    top命令:
    top - 09:29:59 up 4 min, 2 users, load average: 0.48, 0.55, 0.27
    Tasks: 225 total, 2 running, 223 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 1.9 us, 1.0 sy, 0.4 ni, 96.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 1865308 total, 75944 free, 1247252 used, 542112 buff/cache
    KiB Swap: 2097148 total, 2097148 free, 0 used. 406944 avail Mem

    1. 09:29:59 系统当前时间,<br /> up 4 min 系统运行时间<br /> 2 users 系统使用的用户
    2. total 进程总数<br /> running 正在运行的进程数<br /> sleeping 睡眠的线程数<br /> stop 停止的进程数<br /> zombie 僵尸进程数
    3. us 用户空间占用百分比<br /> sy 内核空间占用百分比<br /> id 空闲CPU占用百分比<br /> wa 等待输入输出的CPU时间百分比<br /> hi 硬件CPU中断占用百分比<br /> si 软中断占用百分比<br /> st 虚拟机占用百分比

    最后两行:
    1865308 total 物理内存总量
    75944 free 空闲内存总量
    1247252 used 使用的物理内存总量

    1. %MEM 进程使用的物理内存百分比<br /> %CPU 上次更新到现在的CPU时间占用百分比
    2. ni 用户进程空间内改变过优先级的进程占用百分比<br /> <br /> load average: 0.48, 0.55, 0.27 系统任务负载
    3. 最重要的是load average: 0.15, 0.05, 0.01这行信息,他说的是CPU1分钟、5分钟、15分钟内的负载情况。<br /> 这里要给大家着重解释一下这个CPU负载是什么意思,假设我们是一个4核的CPU,此时如果你的CPU负载是0.15,这就说明,4CPU中连一个核都没用满,4CPU基本都很空闲,没啥人在用。<br /> 如果你的CPU负载是1,那说明4CPU中有一个核已经被使用的比较繁忙了,另外3个核还是比较空闲一些。要是CPU负载是1.5,说明有一个核被使用繁忙,另外一个核也在使用,但是没那么繁忙,还有2个核可能还是空闲的。<br /> 如果你的CPU负载是4,那说明4CPU都被跑满了,如果你的CPU负载是6,那说明4CPU被繁忙的使用还不够处理当前的任务,很多进程可能一直在等待CPU去执行自己的任务。

    top -Hp 进程id



    dstat 命令:https://commandnotfound.cn/linux/1/272/dstat-%E5%91%BD%E4%BB%A4
    dstat -d 查看存储的IO吞吐量
    dsk/total-
    read writ
    582k 48k
    0 0
    0 0
    存储的IO吞吐量每秒钟读取582KB,每秒写入48KB,普通的机械硬盘都可以做到每秒钟上百MB的读写数据量

    1. **dstat -r IOPS和写IOPS,随机磁盘读写每秒钟多少次**<br /> --io/total-<br /> read writ<br /> 7.35 0.63 <br /> 2.00 0 <br /> 17.0 0 <br /> 156 3.00 <br /> 每秒钟随机读7.35次,随机写0.63次,一般随机磁盘读写每秒在两三百次都是可以承受的
    2. **dstat -n 监控网卡的流量情况**<br /> -net/total-<br /> recv send<br /> 154B 785B<br /> 0 316B<br /> 0 90B<br /> 150B 150B<br /> 每秒钟接收发送的流量是多少,如何你的机器使用的是千兆网卡,每秒钟网卡的总流量在100MB左右,甚至更低一点
    1. -c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。
    2. -C:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0cpu1的信息。
    3. -d:显示磁盘读写数据大小。
    4. -D hda,totalinclude hda and total
    5. -n:显示网络状态。
    6. -N eth1,total:有多块网卡时,指定要显示的网卡。
    7. -l:显示系统负载情况。
    8. -m:显示内存使用情况。
    9. -g:显示页面使用情况。
    10. -p:显示进程状态。
    11. -s:显示交换分区使用情况。
    12. -S:类似D/N
    13. -rI/O请求情况。
    14. -y:系统状态。
    15. --ipc:显示ipc消息队列,信号等信息。
    16. --socket:用来显示tcp udp端口状态。
    17. -a:此为默认选项,等同于-cdngy
    18. -v:等同于 -pmgdsc -D total
    19. --output 文件:此选项也比较有用,可以把状态信息以csv的格式重定向到指定的文件中,以便日后查看。例:dstat --output /root/dstat.csv & 此时让程序默默的在后台运行并把结果输出到/root/dstat.csv文件中。