sql优化-检索及定位

一、执行频率早知道

 >show status;

使用 show status了解各种sql的执行频率
可搭配参数 global 全局查看,或者session当前连接开始计数 默认不加参数是指查看当前连接
show status;
+-----------------------------------------------+----------------+
| Variable_name                                 | Value          |
+-----------------------------------------------+----------------+
| Aborted_clients                               | 65             |
| Aborted_connects                              | 589            |
| Binlog_cache_disk_use                         | 0              |
| Binlog_cache_use                              | 0              |
| Binlog_stmt_cache_disk_use                    | 0              |
| Binlog_stmt_cache_use                         | 0              |
| Bytes_received                                | 1649           |
| Bytes_sent                                    | 11767          |
| Com_admin_commands                            | 0              |
| Com_assign_to_keycache                        | 0              |
| Com_alter_db                                  | 0              |
| Com_alter_db_upgrade                          | 0              |
...

>常见的统计参数

 Com_select :执行select操作的次数,一次只累加1
 Com_insert:执行insert操作的次数,一次也只累加1
 Com_update:执行update操作的次数
 Com_delete:执行delete的次数
 Innodb_rows_read select查询的返回的行数
 Innodb_rows_inserted 执行INSERT操作插入的行数
 Innodb_rows_updated 执行update操作更新的行数
 Innodb_rows_deleted 执行deleted操作删除的行数
 Connections:试图连接MYSQL服务器的次数。
 Uptime 服务器工作时间。
 Slow_queries 慢查询的次数。

>查看忙查询次数

mysql> show global status like ‘Slow_queries‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 4     |
+---------------+-------+
1 row in set (0.00 sec)

二、效率较低早查询

>开启慢查询日志

        MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间通过long_query_time值来设定,超过这个值则会被记录到慢查询日志中。long_query_time的默认值为10,默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

1>查看是否开启忙日志查询

show variables like ‘%slow_query_log%‘;

2>开启满日志查询

1.配置文件修改
log-slow-queries = /usr/local/mysql/var/slowquery.log
long_query_time = 3  #单位是秒
log-queries-not-using-indexes
2.使用sql语句修改
set global log_slow_queries = ON;
set global slow_query_log = ON;
set global long_query_time=0.01#单位是秒

3>慢日志格式

select * from auction1.user where user_name=‘liaoxz‘;
执行的慢查询语句
# Time: 170427  4:41:48
日志记录的时间
# [email protected]: root[root] @ localhost []
服务器用户/主机名
# Query_time: 10.007816  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0
总的查询时间、锁定时间、"发送"或者返回的行数、查询过程中所检查的行数

三、分析语句早实行

>show profiles

profiling在mysql中默认是关闭的,在数据库会话级别可以打开,开启之后会收集在执行语句时候所使用的资源
在会话打开profilinges
set profiling=1;

>使用show profiles查看执行的语句的持续时间和ID

MariaDB [auction1]> show profiles;
+----------+------------+------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                            |
+----------+------------+------------------------------------------------------------------------------------------------------------------+
|        6 | 0.00038804 | select * from orders limit 1                                                                            |
|        7 | 0.00019379 | select * from orders limit 1                                                                            |
|        8 | 0.00028797 | select * from user limit 1                                                                                |
|        9 | 0.00006671 | select * from orders right user where orders.ID=user.id                          |
|       10 | 0.00336970 | select orders*.user.id from  where orders.ID=user.id                             |
|       11 | 0.00005291 | select orders*,user.id from  where orders.ID=user.id                             |
|       12 | 0.00004725 | select orders*,user.id from  orders,user where orders.ID=user.id |
|       13 | 0.00003863 | select orders*,user.id from  orders,user where orders.ID=user.id |
|       14 | 0.00024284 | select * from orders limit 1                                                                            |
|       15 | 0.00027788 | select * from orders limit 10                                                                           |
|       16 | 0.00007312 | select * from user where user=‘liaoxz‘;
select * from user where user=‘liaoxz‘                    |
|       17 | 0.00031860 | select * from user limit 1                                                                                |
|       18 | 0.02771239 | select * from user where user_name=‘liaoxz‘                                                               |
|       19 | 0.03121868 | select * from user where user_name=‘liaoxz‘                                                               |
|       20 | 0.02219678 | select * from user where user_name=‘liaoxz‘                                                               |
+----------+------------+------------------------------------------------------------------------------------------------------------------+
15 rows in set (0.00 sec)

>通过指定ID查询执行时的持续时间

MariaDB [auction1]> show profile for query 20;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000038 |
| checking permissions | 0.000005 |
| Opening tables       | 0.000010 |
| After opening tables | 0.000004 |
| System lock          | 0.000002 |
| Table lock           | 0.000002 |
| After table lock     | 0.000004 |
| init                 | 0.000035 |
| optimizing           | 0.000011 |
| statistics           | 0.000013 |
| preparing            | 0.000008 |
| executing            | 0.000002 |
| Sending data         | 0.021981 |
| end                  | 0.000012 |
| query end            | 0.000004 |
| closing tables       | 0.000007 |
| freeing items        | 0.000006 |
| updating status      | 0.000019 |
| logging slow query   | 0.000032 |
| cleaning up          | 0.000002 |
+----------------------+----------+
20 rows in set (0.00 sec)

>具体资源耗费查询(all,cpu,block io,context switch,page faults)

MariaDB [auction1_1]> show profile cpu for query 20;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting             | 0.000038 | 0.000000 |   0.000000 |
| checking permissions | 0.000005 | 0.000000 |   0.000000 |
| Opening tables       | 0.000010 | 0.000000 |   0.000000 |
| After opening tables | 0.000004 | 0.000000 |   0.000000 |
| System lock          | 0.000002 | 0.000000 |   0.000000 |
| Table lock           | 0.000002 | 0.000000 |   0.000000 |
| After table lock     | 0.000004 | 0.000000 |   0.000000 |
| init                 | 0.000035 | 0.000000 |   0.000000 |
| optimizing           | 0.000011 | 0.000000 |   0.000000 |
| statistics           | 0.000013 | 0.000000 |   0.000000 |
| preparing            | 0.000008 | 0.000000 |   0.000000 |
| executing            | 0.000002 | 0.000000 |   0.000000 |
| Sending data         | 0.021981 | 0.026852 |   0.000000 |
| end                  | 0.000012 | 0.000000 |   0.000000 |
| query end            | 0.000004 | 0.000000 |   0.000000 |
| closing tables       | 0.000007 | 0.000000 |   0.000000 |
| freeing items        | 0.000006 | 0.000000 |   0.000000 |
| updating status      | 0.000019 | 0.000000 |   0.000000 |
| logging slow query   | 0.000032 | 0.000000 |   0.000000 |
| cleaning up          | 0.000002 | 0.000000 |   0.000000 |
+----------------------+----------+----------+------------+
20 rows in set (0.00 sec)

四、常见show命令大全

>sql show大全

>1. show tables/show tables from database_name; -- 显示当前数据库中所有表的名称。

>2. show databases; -- 显示mysql中所有数据库的名称。

>3. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。

>4. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令。

>5. show index from table_name; -- 显示表的索引。

>6. show variables; -- 显示系统变量的名称和值。

>7. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。

>8. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。

>9. show privileges; -- 显示服务器所支持的不同权限。

>10. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。

>11. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库。

>12. show engines; -- 显示安装以后可用的存储引擎和默认引擎。

>13. show innodb status; -- 显示innoDB存储引擎的状态。

>14. show logs; -- 显示BDB存储引擎的日志。

>15. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。

>16. show errors; -- 只显示最后一个执行语句所产生的错误。

>17. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。

五、mysql配置文件来一套

>配置文件/etc/my.cnf

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8

[mysqld]
default-time-zone = ‘+8:00‘
server-id=9527
user=mysql

#bin-log日志相关优化参数
log-bin=mysql-master-bin
#混合模式复制
binlog_format = mixed
#存储二进制缓存
binlog_cache_size = 16M
#bin-log日志保存多长时间
expire_logs_days=7
#最大连接数
max_connections=1000
#事务提交或事务外的指令把日志写入(flush)硬盘
innodb_flush_log_at_trx_commit=1
#文件系统自动识别缓存大小是否写入磁盘
sync_binlog=0
datadir = /data/mysqldb
port = 3306
socket = /tmp/mysql.sock
#table_cache = 5000
#缓存大小设置
query_cache_size = 256M
#单个查询使用多大缓冲区
query_cache_limit = 16M
#内存表大小
max_heap_table_size = 128M
#线程池大小
thread_cache_size = 128
#慢查询超过多长时间写入日志
long_query_time = 3
#临时表大小
tmp_table_size = 128M
#设置索引缓冲区大小
key_buffer_size = 256M
#数据包大小接受设置
max_allowed_packet = 64M
#索引扫描,范围索引扫描,无索引全表扫描的表连接 缓存的大小
join_buffer_size = 16M
#排序 会话 的缓存大小
sort_buffer_size = 16M
#顺序读表缓存
read_buffer_size = 16M
#随机读缓冲区大小
read_rnd_buffer_size = 64M
#缓存innodb表的索引,数据,插入数据时的缓冲
innodb_buffer_pool_size = 6G
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#timestamp类型的列明确的注明default值
explicit_defaults_for_timestamp=true
#禁止域名解析
skip-name-resolve
#数据库是否支持符号链接存储,1为允许
symbolic-links=0
#数据库级的字符集,对之前数据不产生影响
character-set-server=utf8mb4
#大小写铭感
lower_case_table_names=1
服务器关闭非交互连接之前等待活动的秒数
wait_timeout=180
#闭一个交互的连接之前所要等待的秒数
interactive_timeout=180
时间: 2024-12-31 03:31:57

sql优化-检索及定位的相关文章

SQL性能优化:如何定位网络性能问题

一同事跟我反馈他遇到了一个SQL性能问题,他说全表只有69条记录,客户端执行耗费了两分多钟,这不科学呀.要我分析一下原因并解决.我按照类似表结构,构造了一个案例,测试截图如下所示 这个表有13800KB(也就是13M多大小),因为该表将图片保存到数据库(Item_Photo字段为iamge类型),这个是历史原因,暂且不喷这种的设计.看来这个SQL执行时间长的性能问题不在于IO和SQL本身执行计划是否有问题,而是在网络数据传时间上(服务器与客户端位于异地,两地专线带宽6M,不过很多应用.邮件.系统

SQL优化经验

SQL 优化经验总结34条 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection tabl

SQL 优化经验总结34条(转)

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHE

SQL优化技巧(Oracle)

SQL优化技巧(1): Where子句中的连接顺序:oracle采用自下而 上的顺序解析where子句,根据这个原理,表 之间的连接必须写在其他where条件之前,那些可以过滤掉大量记录的条件 必须写在where子句的末尾. 例如 低效:select * from report_sale_account e where hsje>5000 and dzxl = '000001' and 25<(select count(*) from report_sale_account where cod

SQL优化34条

我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表,

(转)SQL优化原则

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索

提高SQL查询效率(SQL优化)(转载)

(转自http://blog.csdn.net/sforiz/article/details/5345359) 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表

MS Sql优化(转自网络)

MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

SQL优化(zhuan)

转自:http://www.jfox.info/SQL-you-hua 数据库的优化问题 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优 化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现