为什么要优化:

随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整。

数据库优化这个课题较大,可分为四大类:

》主机性能
》内存使用性能
》网络传输性能
》SQL语句执行性能【软件工程师】
下面列出一些数据库SQL优化方案:

(01)选择最有效率的表名顺序(笔试常考)

数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表放在最后,如果有3个以上的表连接查询,那就需要选择那个被其他表所引用的表放在最后。

例如:查询员工的编号,姓名,工资,工资等级,部门名

  1. select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
  2. from salgrade,dept,emp
  3. where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)

1)如果三个表是完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推
2)如果三个表是有关系的话,将引用最多的表,放在最后,然后依次类推

(02)WHERE子句中的连接顺序(笔试常考)

数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。

例如:查询员工的编号,姓名,工资,部门名

  1. select emp.empno,emp.ename,emp.sal,dept.dname
  2. from emp,dept
  3. where (emp.deptno = dept.deptno) and (emp.sal > 1500)

(03)SELECT子句中避免使用*号

数据库在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间

select empno,ename from emp;
(04)用TRUNCATE替代DELETE

(05)尽量多使用COMMIT

因为COMMIT会释放回滚点

(06)用WHERE子句替换HAVING子句

WHERE先执行,HAVING后执行

(07)多使用内部函数提高SQL效率

(08)使用表的别名

salgrade s

(09)使用列的别名

ename e

总之,数据库优化不是一天的课题,你得在长期工作实践中,进行反复测试与总结,希望学员们日后好好领会

今天我们分享一些 分析mysql表读写、索引等等操作的sql语句。

闲话不多说,直接上代码:

反映表的读写压力

  1. SELECT file_name AS file,
  2. count_read,
  3. sum_number_of_bytes_read AS total_read,
  4. count_write,
  5. sum_number_of_bytes_write AS total_written,
  6. (sum_number_of_bytes_read + sum_number_of_bytes_write) AS total
  7. FROM performance_schema.file_summary_by_instance
  8. ORDER BY sum_number_of_bytes_read+ sum_number_of_bytes_write DESC;

反映文件的延迟

  1. SELECT (file_name) AS file,
  2. count_star AS total,
  3. CONCAT(ROUND(sum_timer_wait / 3600000000000000, 2), 'h') AS total_latency,
  4. count_read,
  5. CONCAT(ROUND(sum_timer_read / 1000000000000, 2), 's') AS read_latency,
  6. count_write,
  7. CONCAT(ROUND(sum_timer_write / 3600000000000000, 2), 'h')AS write_latency
  8. FROM performance_schema.file_summary_by_instance
  9. ORDER BY sum_timer_wait DESC;

table 的读写延迟

  1. SELECT object_schema AS table_schema,
  2. object_name AS table_name,
  3. count_star AS total,
  4. CONCAT(ROUND(sum_timer_wait / 3600000000000000, 2), 'h') as total_latency,
  5. CONCAT(ROUND((sum_timer_wait / count_star) / 1000000, 2), 'us') AS avg_latency,
  6. CONCAT(ROUND(max_timer_wait / 1000000000, 2), 'ms') AS max_latency
  7. FROM performance_schema.objects_summary_global_by_type
  8. ORDER BY sum_timer_wait DESC;

查看表操作频度

  1. SELECT object_schema AS table_schema,
  2. object_name AS table_name,
  3. count_star AS rows_io_total,
  4. count_read AS rows_read,
  5. count_write AS rows_write,
  6. count_fetch AS rows_fetchs,
  7. count_insert AS rows_inserts,
  8. count_update AS rows_updates,
  9. count_delete AS rows_deletes,
  10. CONCAT(ROUND(sum_timer_fetch / 3600000000000000, 2), 'h') AS fetch_latency,
  11. CONCAT(ROUND(sum_timer_insert / 3600000000000000, 2), 'h') AS insert_latency,
  12. CONCAT(ROUND(sum_timer_update / 3600000000000000, 2), 'h') AS update_latency,
  13. CONCAT(ROUND(sum_timer_delete / 3600000000000000, 2), 'h') AS delete_latency
  14. FROM performance_schema.table_io_waits_summary_by_table
  15. ORDER BY sum_timer_wait DESC ;

索引状况

  1. SELECT OBJECT_SCHEMA AS table_schema,
  2. OBJECT_NAME AS table_name,
  3. INDEX_NAME as index_name,
  4. COUNT_FETCH AS rows_fetched,
  5. CONCAT(ROUND(SUM_TIMER_FETCH / 3600000000000000, 2), 'h') AS select_latency,
  6. COUNT_INSERT AS rows_inserted,
  7. CONCAT(ROUND(SUM_TIMER_INSERT / 3600000000000000, 2), 'h') AS insert_latency,
  8. COUNT_UPDATE AS rows_updated,
  9. CONCAT(ROUND(SUM_TIMER_UPDATE / 3600000000000000, 2), 'h') AS update_latency,
  10. COUNT_DELETE AS rows_deleted,
  11. CONCAT(ROUND(SUM_TIMER_DELETE / 3600000000000000, 2), 'h')AS delete_latency
  12. FROM performance_schema.table_io_waits_summary_by_index_usage
  13. WHERE index_name IS NOT NULL
  14. ORDER BY sum_timer_wait DESC;

全表扫描情况

  1. SELECT object_schema,
  2. object_name,
  3. count_read AS rows_full_scanned
  4. FROM performance_schema.table_io_waits_summary_by_index_usage
  5. WHERE index_name IS NULL
  6. AND count_read > 0
  7. ORDER BY count_read DESC;
  8. 没有使用的index
  9.  
  10. SELECT object_schema,
  11. object_name,
  12. index_name
  13. FROM performance_schema.table_io_waits_summary_by_index_usage
  14. WHERE index_name IS NOT NULL
  15. AND count_star = 0
  16. AND object_schema not in ('mysql','v_monitor')
  17. AND index_name <> 'PRIMARY'
  18. ORDER BY object_schema, object_name;

糟糕的sql问题摘要

  1. SELECT (DIGEST_TEXT) AS query,
  2. SCHEMA_NAME AS db,
  3. IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan,
  4. COUNT_STAR AS exec_count,
  5. SUM_ERRORS AS err_count,
  6. SUM_WARNINGS AS warn_count,
  7. (SUM_TIMER_WAIT) AS total_latency,
  8. (MAX_TIMER_WAIT) AS max_latency,
  9. (AVG_TIMER_WAIT) AS avg_latency,
  10. (SUM_LOCK_TIME) AS lock_latency,
  11. format(SUM_ROWS_SENT,0) AS rows_sent,
  12. ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
  13. SUM_ROWS_EXAMINED AS rows_examined,
  14. ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
  15. SUM_CREATED_TMP_TABLES AS tmp_tables,
  16. SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,
  17. SUM_SORT_ROWS AS rows_sorted,
  18. SUM_SORT_MERGE_PASSES AS sort_merge_passes,
  19. DIGEST AS digest,
  20. FIRST_SEEN AS first_seen,
  21. LAST_SEEN as last_seen
  22. FROM performance_schema.events_statements_summary_by_digest d
  23. where d
  24. ORDER BY SUM_TIMER_WAIT DESC
  25. limit 20;

掌握这些sql,你能轻松知道你的库那些表存在问题,然后考虑怎么去优化。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

优化、分析Mysql表读写、索引等操作的sql语句效率优化问题的更多相关文章

  1. Mysql中Innodb大量插入数据时SQL语句的优化

    innodb优化后,29小时入库1300万条数据 参考:http://blog.51yip.com/mysql/1369.html 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据: A ...

  2. MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)

     一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提 ...

  3. MySql数据库3【优化2】sql语句的优化

    1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数, ...

  4. Mysql增加主键或者更改表的列为主键的sql语句

                                                                                                        ...

  5. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

  6. 谈谈SQL 语句的优化技术

    https://blogs.msdn.microsoft.com/apgcdsd/2011/01/10/sql-1/ 一.引言 一个凸现在很多开发者或数据库管理员面前的问题是数据库系统的性能问题.性能 ...

  7. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

  8. Oracle数据库的sql语句性能优化

    在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...

  9. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

随机推荐

  1. 关与 @EnableConfigurationProperties 注解

    @EnableConfigurationProperties注解的作用是: 让使用 @ConfigurationProperties 注解的类生效. 当@EnableConfigurationProp ...

  2. JDBC及C3P0常用类

    JDBC(Java Database Connectivity)JAVA数据库连接,它是一套用于执行SQL语句的Java API.JDBC可以通过不同驱动与不同数据库连接,相当于JAVA和数据库之间的 ...

  3. 数据库操作之DBUtils

    概述 DBUtils是Java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. DBUtils三个核心功能介绍 QueryRunne ...

  4. ObjectARX之Mac os开发

    网上关于ObjectARX开发的相关介绍都基于Windows环境.Mac 环境的开发几乎没有,下面介绍Mac环境下ObjectARX的开发. AutoCAD ObjectARX开发必备条件: 1. 安 ...

  5. 当请求进入Nginx后,每个HTTP执行阶段的作用

    阶段顺序 阶段名称 作用 1 NGX_HTTP_POSTREAD_PHASE = 0 接收并读取请求阶段 2 NGX_HTTP_SERVER_REWRITE_PHASE 修改url阶段,通常有重定向和 ...

  6. JS高阶---作用域面试

    面试题1: ,答案为10 有一点需要明确:作用域是在定义编写代码时已经决定好的 面试题2: 结果1: 结果2: 首先在内部作用域找,没有 然后在全局作用域找,window没有,所以会报错 如果想找对象 ...

  7. Go语言goroutine调度器概述(11)

    本文是<go调度器源代码情景分析>系列的第11篇,也是第二章的第1小节. goroutine简介 goroutine是Go语言实现的用户态线程,主要用来解决操作系统线程太“重”的问题,所谓 ...

  8. 过滤身份证号和grep复习

    一.把身份证号过滤出来 我们还是从一道面试题说起. 请从test.txt文件当中过滤出正确的的身份证号码 [root@localhost test.dir]# cat test.txt 赵 37083 ...

  9. USACO Spinning Wheels

    洛谷 P2728 纺车的轮子 Spinning Wheels https://www.luogu.org/problemnew/show/P2728 JDOJ 1800: Spinning Wheel ...

  10. oracle sql语言模糊查询

    '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合.'$' 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n ...