[Mis][MySQL] MySQL 连接数过高 和 慢查询优化 - Gukie/learning GitHub Wiki

refer

一个MySQL物理表,建议存储几条数据

建议500万条左右的时候,就要考虑分库分表了

一般情况下,建议单个物理分表的容量不超过500万行数据。通常可以预估1到2年的数据增长量,用估算出的总数据量除以总的物理分库数,再除以建议的最大数据量500万,即可得出每个物理分库上需要创建的物理分表数:

物理分库上的物理分表数 = 向上取整(估算的总数据量 / (RDS 实例数 * 8) / 5,000,000)

连接数过高

当“连接数过高”发生,或者CPU过高时,一般都是由于某些线程长时间被占用导致后面的连接必须等待 可以通过 show processList,查看那些线程的一些状态,从而能看出线程的一些异常,从而分析是否有一些SQL或者程序写的有问题

满查询发生

当一个SQL执行了过长时间时,可以使用一下方式进行

  • 使用 show profile,该命令可以查看SQL执行的时间
  • 使用 show processList,来检查是否有线程处于异常状态
  • 使用 show status,查看临时文件,句柄计数器(handler-counter)等的详细信息
  • 使用 Explain,分析SQL的执行情况

some note

show processList 只能查看到正在执行SQL的线程一些状态,当SQL执行完了之后,它就看不到啥了

  • 开始使用show profile的时候,如果没有打开 profiling(默认是关闭的),需要设置
set profiling =1;
  • show profiles 默认只显示15条,如果需要显示更多的数据,需要设置 profiling_history_size,该参数最大支持100
set profiling_history_size = 100;
  • 整体的SQL
set profiling_history_size = 100;

SELECT DISTINCT(S1.store_id) FROM `sale_sample` S1 WHERE S1.`order_source` in (1,2)  and not EXISTS  (
        SELECT  S2.`store_id`  FROM `sale_sample` S2 WHERE S2.`order_source` in (3) and S1.`store_id` = S2.`store_id` 
);

show profiles;
  • show profiles的结果
Query_ID Duration Query
422 2.7440735 SELECT DISTINCT(S1.store_id) FROM sale_sample S1 WHERE S1.order_source in (1,2) and not EXISTS ( SELECT S2.store_id FROM sale_sample S2 WHERE S2.order_source in (3) and S1.store_id = S2.store_id );
  • 执行 show profile 可以看到具体的细节
show profile ALL FOR QUERY 422;