分类 IT运维 下的文章

转载:https://www.cnblogs.com/ddzj01/p/11365541.html

一、前言

生产中偶尔会碰到一些sql,有多种执行计划,其中部分情况是统计信息过旧造成的,重新收集下统计信息就行了。但是有些时候重新收集统计信息也解决不了问题,而开发又在嗷嗷叫,没时间让你去慢慢分析原因的时候,这时临时的解决办法是通过spm去固定一个正确的执行计划,等找到真正原因后再解除该spm。

- 阅读剩余部分 -

使用脚本批量Telnet测试端口是否连通
在一些情况下,我们无法安装nc,ansible等工具,所以一些批量操作,我们只能使用shell实现。下面分享一个近期工作中使用到的批量Telnet端口的脚本,希望对大家能够帮助:

脚本内容:

#!/bin/bash
check_telnet(){
for ip_port in $(cat ip_info|grep -v '^#')
do
    CHECK_PORT=$(echo $ip_port|awk -F: '{print $2}')
    CHECK_IP=$(echo $ip_port|awk -F: '{print $1}')
    echo -e "\n"| telnet $CHECK_IP $CHECK_PORT |grep "Connected to\|Escape character" >/dev/null
    if [ $? -eq 0 ];then
        echo "$LOCALIP result $CHECK_IP $CHECK_PORT connected"
    else
        echo "$LOCALIP result $CHECK_IP $CHECK_PORT can not Connected"
    fi
done
}
check_telnet >result.log

ip_info 列表内容

请使用ip:port 或者 域名:port 的格式编辑以下内容;

如果是一个列表,可以使用#对不进行测试的IP进行注释

192.168.1.1:8080
192.168.1.2:22
#192.168.1.3:8090
baidu.com:8080

使用方法
./telnet_batch,sh
————————————————
版权声明:本文为CSDN博主「story-xu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31457413/article/details/107590571

1、《基于Oracle的SQL优化》
链接:https://pan.baidu.com/s/1l-7MjKef4vKbBrs5gATdWg
提取码:wkqq
2、《收获不止oracle》
链接:https://pan.baidu.com/s/1h_CWm0gQim9IvbKWJevULQ
提取码:wkqq
3、《rac集群管理》
链接:https://pan.baidu.com/s/153973bd1MnzMlkcqBop2Zw
提取码:wkqq
4、《oracle管理》
链接:https://pan.baidu.com/s/1JMxJnhPHt-vcruferwzZpg
提取码:wkqq
5、《收获不止sql优化》
链接:https://pan.baidu.com/s/1Gwjtvwe7rZZBfhC1Qum_Ig
提取码:wkqq

sql 执行频率

一、通过 show status 命令了解各种sql的执行频率

mysql客户端连接成功后,通过show[session|global] status命令,可以查看服务器的状态,如果不加默认为session(session级为当前连接的统计结果,global级为自数据库上次启动到现在的统计结果)。
Eg: show status like 'Com_%';

com_xx表示每个xx语句的执行次数,通常着重看curd操作次数(这些参数适用于所有存储引擎);

Com_insert:执行select操作的次数,一次查询只累加1;
Com_select:执行insert操作的次数,批量插入的insert操作只累加一次;
Com_delete:执行update操作次数,提交和回滚均会累加;
Com_update:执行delete操作次数。
针对innodb存储引擎的表操作,累加的算法比如:show status like 'Innodb_rows_%';

show status like 'connections';----- 试图连接mysql数据库的次数

show status like ‘uptime’;-- 服务器工作时间

show status like ‘slow_queries’; – 慢查询的次数

二、定位执行效率较低的sql语句

​ 通过慢查询日志定位哪些sql执行效率低下,用–log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time 秒的sql语句的日志文件,具体可参看后面的日志管理部分。
​ 慢查询日志在查询结束以后才记录,所以在应用反正执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前mysql在进行的线程,包括线程的状态,是否锁表等,可以实时查看sql的执行情况,同时对一些锁表操作进行优化。

三、通过explain分析低效sql的执行计划

追查到效率低的sql后,可以通过explain或desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序,eg:统计某个email为租赁电影拷贝所支付的总金额,需要关联客户表customer和付款表payment,并且对付款金额amount字段做求和操作,相应sql的执行计划如下:
explain select sum(amount) from customer a ,payment b where 1=1 and a.customer_id=b.customer_id and email ='JANE.BENNETT@SAKILACUSTOMER.ORG'\G

下面对每个列进行简单说明:
select_type:表示select的类型,常见取值 simple(简单表,即不适用表连接或者子查询),primary(主查询,即外层的查询),union(union中的第二个或者后面的查询语句),subquery(子查询中的第一个select)等。
table:输出结果集的表。
possible_keys:表示查询时可能使用的索引,不表示出现在这里的就是表的全部索引。
key:表示实际使用的索引。
key_len:使用到索引字段的长度。
rows:扫描行的数量。
extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。

type:表示mysql在表中找到所需行的方式,或者叫访问类型,常见如下(性能由左至右由最差变道最好):all 、 index 、 range 、 ref、 eq_ref 、 const,system 、 null