zoukankan      html  css  js  c++  java
  • 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

    为什么要优化:

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

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

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

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

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

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

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

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

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

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

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

    select emp.empno,emp.ename,emp.sal,dept.dname
    from emp,dept
    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语句。

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

    反映表的读写压力

    SELECT file_name AS file,
    count_read,
    sum_number_of_bytes_read AS total_read,
    count_write,
    sum_number_of_bytes_write AS total_written,
    (sum_number_of_bytes_read + sum_number_of_bytes_write) AS total
    FROM performance_schema.file_summary_by_instance
    ORDER BY sum_number_of_bytes_read+ sum_number_of_bytes_write DESC;

    反映文件的延迟

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

    table 的读写延迟

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

    查看表操作频度

    SELECT object_schema AS table_schema,
    object_name AS table_name,
    count_star AS rows_io_total,
    count_read AS rows_read,
    count_write AS rows_write,
    count_fetch AS rows_fetchs,
    count_insert AS rows_inserts,
    count_update AS rows_updates,
    count_delete AS rows_deletes,
    CONCAT(ROUND(sum_timer_fetch / 3600000000000000, 2), 'h') AS fetch_latency,
    CONCAT(ROUND(sum_timer_insert / 3600000000000000, 2), 'h') AS insert_latency,
    CONCAT(ROUND(sum_timer_update / 3600000000000000, 2), 'h') AS update_latency,
    CONCAT(ROUND(sum_timer_delete / 3600000000000000, 2), 'h') AS delete_latency
    FROM performance_schema.table_io_waits_summary_by_table
    ORDER BY sum_timer_wait DESC ;

    索引状况

    SELECT OBJECT_SCHEMA AS table_schema,
    OBJECT_NAME AS table_name,
    INDEX_NAME as index_name,
    COUNT_FETCH AS rows_fetched,
    CONCAT(ROUND(SUM_TIMER_FETCH / 3600000000000000, 2), 'h') AS select_latency,
    COUNT_INSERT AS rows_inserted,
    CONCAT(ROUND(SUM_TIMER_INSERT / 3600000000000000, 2), 'h') AS insert_latency,
    COUNT_UPDATE AS rows_updated,
    CONCAT(ROUND(SUM_TIMER_UPDATE / 3600000000000000, 2), 'h') AS update_latency,
    COUNT_DELETE AS rows_deleted,
    CONCAT(ROUND(SUM_TIMER_DELETE / 3600000000000000, 2), 'h')AS delete_latency
    FROM performance_schema.table_io_waits_summary_by_index_usage
    WHERE index_name IS NOT NULL
    ORDER BY sum_timer_wait DESC;

    全表扫描情况

    SELECT object_schema,
    object_name,
    count_read AS rows_full_scanned
    FROM performance_schema.table_io_waits_summary_by_index_usage
    WHERE index_name IS NULL
    AND count_read > 0
    ORDER BY count_read DESC;
    没有使用的index
    
    SELECT object_schema,
    object_name,
    index_name
    FROM performance_schema.table_io_waits_summary_by_index_usage
    WHERE index_name IS NOT NULL
    AND count_star = 0
    AND object_schema not in ('mysql','v_monitor')
    AND index_name <> 'PRIMARY'
    ORDER BY object_schema, object_name;

    糟糕的sql问题摘要

    SELECT (DIGEST_TEXT) AS query,
    SCHEMA_NAME AS db,
    IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan,
    COUNT_STAR AS exec_count,
    SUM_ERRORS AS err_count,
    SUM_WARNINGS AS warn_count,
    (SUM_TIMER_WAIT) AS total_latency,
    (MAX_TIMER_WAIT) AS max_latency,
    (AVG_TIMER_WAIT) AS avg_latency,
    (SUM_LOCK_TIME) AS lock_latency,
    format(SUM_ROWS_SENT,0) AS rows_sent,
    ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
    SUM_ROWS_EXAMINED AS rows_examined,
    ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
    SUM_CREATED_TMP_TABLES AS tmp_tables,
    SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,
    SUM_SORT_ROWS AS rows_sorted,
    SUM_SORT_MERGE_PASSES AS sort_merge_passes,
    DIGEST AS digest,
    FIRST_SEEN AS first_seen,
    LAST_SEEN as last_seen
    FROM performance_schema.events_statements_summary_by_digest d
    where d
    ORDER BY SUM_TIMER_WAIT DESC
    limit 20;

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

    总结

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

  • 相关阅读:
    Linux用户权限规范 /etc/sudoers文件解释
    Linux命令-用户、用户组、权限
    百度云盘问题专栏
    Chrome插件下载地址
    Linux命令-tar
    python:rs, ws, es = select.select(inputs, [], []) --报错error 10022
    1月份学习计划
    @Override 注解compiler1.5和compiler1.6不同
    tomcat启动(Ⅷ)--请求最终目的地 getContainer().getPipeline().getFirst().invoke(request, response)
    tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/11070014.html
Copyright © 2011-2022 走看看