• 3.MySQL优化---单表查询优化的一些小总结(非索引设计)


    整理自互联网.
    摘要:

    接下来这篇是查询优化。其实,大家都知道,查询部分是远远大于增删改的,所以查询优化会花更多篇幅去讲解。本篇会先讲单表查询优化(非索引设计)。然后讲多表查询优化。索引优化设计以及库表结构优化等后面文章再讲。

    一.单表查询优化:(关于索引,后面再开单章讲解)

    (1)可以先使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮我们分析是查询语句或是表结构的性能瓶颈。

    (2)写sql要明确需要的字段,要多少就写多少字段,而不是滥用 select *

    (3)可以用使用连接(JOIN)来代替子查询

    (4)使用分页语句:limit start , count 或者条件 where子句时,有什么可限制的条件尽量加上,查一条就limit一条。做到不滥用。比如说我之前做过的的p2p项目,只是需要知道有没有一个满标的借款,这样的话就可以用上 limit 1,这样mysql在找到一条数据后就停止搜索,而不是全文搜索完再停止。

    (5)开启查询缓存:

    大多数的MySQL服务器都开启了查询缓存。这是提高查询有效的方法之一。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。

    查询缓存工作流程:

    A):服务器接收SQL,以SQL+DB+Query_cache_query_flags作为hash查找键;

    B):找到了相关的结果集就将其返回给客户端;

    C):如果没有找到缓存则执行权限验证、SQL解析、SQL优化等一些列的操作;

    D):执行完SQL之后,将结果集保存到缓存

    当然,并不是每种情况都适合使用缓存,衡量打开缓存是否对系统有性能提升是一个整体的概念。那怎么判断要不要开启缓存呢,如下:

    1)通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)、

    2)通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

    3)通过命中-写入率判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

    相关参数及命令:

    与缓存相关的主要参数如下表所示。可以使用命令SHOW VARIABLES LIKE '%query_cache%'查看

    wpsF82D.tmp

    缓存数据失效时机

    在表的结构或数据发生改变时,查询缓存中的数据不再有效。有这些INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用

    可以使用下面三个SQL来清理查询缓存:

    1、FLUSH QUERY CACHE; // 清理查询缓存内存碎片。

    2、RESET QUERY CACHE; // 从查询缓存中移出所有查询。

    3、FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容。

    InnoDB与查询缓存:

    Innodb会对每个表设置一个事务计数器,里面存储当前最大的事务ID.当一个事务提交时,InnoDB会使用MVCC中系统事务ID最大的事务ID跟新当前表的计数器.

    只有比这个最大ID大的事务能使用查询缓存,其他比这个ID小的事务则不能使用查询缓存.

    另外,在InnoDB中,所有有加锁操作的事务都不使用任何查询缓存

  • 相关阅读:
    excelhelp
    导入数据到GridView
    sql2005悠改sa
    状态存储管理 encode,decode,transfer
    Session持久化
    Microsoft SQL Server 2005 数据类型
    Cookie (HttpCookie的实例)
    role设计
    ajax
    poj 3370 Halloween treats 夜
  • 原文地址:https://www.cnblogs.com/liulei-LL/p/7908459.html
Copyright © 2020-2023  润新知