zoukankan      html  css  js  c++  java
  • MySql知识

    #A表比B表大
    SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
    
    #B表比A表大
    SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)

    #json字段更新
    UPDATE car SET emission_standard = '[]' WHERE JSON_CONTAINS(emission_standard, 'null');

     explain(极客时间)

    id:每个执行计划都有一个 id,如果是一个联合查询,这里还将有多个 id。
    select_type:表示 SELECT 查询类型,常见的有 SIMPLE(普通查询,即没有联合查询、子查询)、PRIMARY(主查询)、UNION(UNION 中后面的查询)、SUBQUERY(子查询)等。
    table:当前执行计划查询的表,如果给表起别名了,则显示别名信息。
    partitions:访问的分区表信息。
    type:表示从表中查询到行所执行的方式,查询方式是 SQL 优化中一个很重要的指标,结果值从好到差依次是:system > const > eq_ref > ref > range > index > ALL。
    system/const:表中只有一行数据匹配,此时根据索引查询一次就能找到对应的数据。
    eq_ref:使用唯一索引扫描,常见于多表连接中使用主键和唯一索引作为关联条件。
    ref:非唯一索引扫描,还可见于唯一索引最左原则匹配扫描。
    range:索引范围扫描,比如,<,>,between 等操作。
    index:索引全表扫描,此时遍历整个索引树。
    ALL:表示全表扫描,需要遍历全表来找到对应的行。
    possible_keys:可能使用到的索引。
    key:实际使用到的索引。
    key_len:当前使用的索引的长度。
    ref:关联 id 等信息。
    rows:查找到记录所扫描的行数。
    filtered:查找到所需记录占总扫描记录数的比例。
    Extra:额外的信息。
    SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]
    
    type参数:
    | ALL:显示所有开销信息
    | BLOCK IO:阻塞的输入输出次数
    | CONTEXT SWITCHES:上下文切换相关开销信息
    | CPU:显示CPU的相关开销信息 
    | IPC:接收和发送消息的相关开销信息
    | MEMORY :显示内存相关的开销,目前无用
    | PAGE FAULTS :显示页面错误相关开销信息
    | SOURCE :列出相应操作对应的函数名及其在源码中的调用位置(行数) 
    | SWAPS:显示swap交换次数的相关开销信息

    MySQL索引原理及慢查询优化

    https://tech.meituan.com/2014/06/30/mysql-index.html

    区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0.

    一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录.

    利用存储过程多次插入数据

    delimiter ;;
    create procedure idata()
    begin
      declare i int;
      set i=1;
      while(i<=100000)do
        insert into t values(i, i, i);
        set i=i+1;
      end while;
    end;;
    delimiter ;
    call idata();

    直接储存

    BEGIN
        declare i int;  # declare语句是在复合语句中声明变量的指令
        set i=1;
        while i<=2000000 do
           insert into `user`(u_name,u_password,u_mail,u_phone,u_sex,u_headImg) values('赵六','000000','zhaoliu@163.com','18800000000',0,'oss.file.com/images/zhaoliu.png');
            set i=i+1;
        end while;
    END

    优化特定类型的查询

    1. 优化COUNT()查询

    如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数(不统计NULL)。最好使用COUNT(*),它会忽略所有的列而直接统计所有的行数。

    1. 优化关联查询
    1. 确保ON或者USING字句中的列上有索引。
    2. 确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列,这样MySQL才有可能使用索引来优化这个过程。
    3. 当升级MySQL的时候需要注意:关联语法、运算符优先级等其他可能会发生变化的地方。因为以前是普通关联的地方可能会变成笛卡尔积,不同类型的关联可能会生成不同的结果等。
    1. 优化子查询

    关于子查询优化我们给出的最重要的优化建议就是尽可能使用关联查询代替

    1. 优化GROUP BY和DISTINCT
    1. 使用索引优化
    2. 如果需要对关联查询做分组(GROUP BY),并且是按照查找表中的某个列进行分组,那么通常采用查找表的标识列分组的效率会更高。
    1. 优化LIMIT分页

    一个非常常见又令人头疼的问题就是,在偏移量非常大的时候,查询的代价非常高。优化的一个简单方法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后再根据需要做一次关联操作再返回所需的列。

    1. 优化UNION查询

    除非确实需要消除重复的行,否则就一定要使用上UNION ALL,这一点很重要。如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致对整个临时表的数据做唯一性检查。

  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/beaconSky/p/11041047.html
Copyright © 2011-2022 走看看