查询

函数

  • 长度

    • LENGTH()
    • 值得注意的是汉字在mysql中占据三个长度,所以判断是不是一个汉字要用length=3?

      调优

      内存过高

  • 背景

    • 爬虫收集知乎提问数据时,收集到300万左右的数据发现mysql占用到了将近1G的内存,但其实300W的数据也没有达到1G大小
  • 解决

  • 参考:https://juejin.cn/post/7048152511605112845

  • 背景
    • count极慢,where极慢,而且count还是使用的主键,仍然需要花将近十秒
  • count慢
    • 参考:https://blog.csdn.net/csdnhsh/article/details/116329858
      • count用来统计结果集中不为null的数值,所以需要进行全表扫描
      • 查询速度大小比较:
      • count(字段)<count(主键id)<count(1)≈count(*)
      • count(1) 无需对数据行进行解析
    • 最终
      • 使用:SHOW TABLE STATUS;查询到内部统计数据代替表的行数查询
      • SELECT (table_rows) FROM information_schema.TABLEs WHERE table_name=’question’;
      • 可见关键的表信息都在系统的 information_schema.TABLEs 表中
      • 但是此方法查询到的数据很不准确很不准确,而且没有实时性,时大时小
  • where慢
    • 主要是对于非主键字段而言查询过慢,所以最好的办法就是直接加索引
      • ALTER TABLE tb_stu_info3 ADD index(id) ;
  • 缓存问题

    • 前提
      • 如果表频繁改动不建议使用
      • 会增加服务器开销,先对比缓存数据
    • 使用查询缓存方式(query_cache_type)
      • 查看是否开启: select @@query_cache_type;
      • 打开缓存:set session query_cache_type=off;
      • 禁用缓存:set session query_cache_type=on;
    • 系统查询缓存可用性(have_query_cache)
      • 查询是否可用:show variables like ‘have_query_cache’;
    • 查询缓存大小(query_cache_size)
      • 查询大小:select @@global.query_cache_size;
      • 设置大小:set @@global.query_cache_size=100000;(1M)
    • 查询结果最大数量(query_cache_limit)
      • 查询现有限制:select @@global.query_cache_limit;
      • 设置大小:set @@global.query_cache_limit=100000;(1M)

        数据迁移

  • 千万级数据

    • 首先去掉除了外键外的所有索引,然后导出为sql脚本
    • 在新服务器执行命令:
      • set global max_allowed_packet=524288000; #修改 512M
    • 将脚本上传至对应服务器
    • 执行sql脚本(脚本内不应有添加除主键外其他索引的命令,且必须包括use xxx)

    • 多表查询

      1. where与on

  • where和on的区别在于效率
    image.png

  • 更严重的效率问题是inner join和select from where,后者先算出笛卡尔积后再进行筛选,前者一步一步筛选(多表的情况下)
    image.png
  • 超长版内连接查询
    image.png

    2. 临时表

  • 创建临时表

    • CREATE TEMPORARY TABLE xxx AS select xxx(查询结果)
    • image.png

      3. having和where

  • 本质的区别就是where筛选的是数据库表里面本来就有的字段,而having筛选的字段是从前筛选的字段筛选的

    • where和having都可以使用的场景:
      • select goods_price,goods_name from sw_goods where goods_price>100
      • select goods_price,goods_name from sw_goods having goods_price>100
      • 原因:goods_price作为条件也出现在了查询字段中。
    • 只可以使用where,不可以使用having的情况:
      • select goods_name,goods_number from sw_goods where goods_price>100
      • select goods_name,goods_number from sw_goods having goods_price>100(X)
      • 原因:goods_price作为筛选条件没有出现在查询字段中,所以就会报错。
      • having的原理是先select 然后从select出来的进行筛选。而where是先筛选在select。
    • 只可以使用having,不可以使用where的情况:
      • select goods_category_id,avg(good_price) as ag from sw_goods group by goods_category having ag>1000
      • select goods_category_id,avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category(X)报错,这个表里没有这个ag这个字段。
      • where子句中一般不使用聚合函数那种情况。
  • 引用:https://www.cnblogs.com/ljf-Sky/p/9024683.html

    4. exist

  • 注意

    • EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。
    • EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。
    • 其内查询语句返回一个结果集。
    • EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
    • 一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
    • 引用:https://www.cnblogs.com/qlqwjy/p/8598091.html
  • 个人理解

    • 刚开始用觉得比较迷惑,是对所有数据使用还是对每个数据使用
    • 上述这个解释就很直白了

      5. group by

  • https://blog.csdn.net/u014717572/article/details/80687042

    骚操作

    SQLyog破解方法

    1. - WIN+R打开命令行窗口wo
    2. - 然后输入regedit打开注册表
    3. - 找到相应注册表<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1582227316332-95073e65-65b4-43e2-a091-cbffd83a3aea.png#crop=0&crop=0&crop=1&crop=1&height=667&id=snDgy&name=image.png&originHeight=667&originWidth=1045&originalType=binary&ratio=1&rotation=0&showTitle=false&size=92051&status=done&style=none&title=&width=1045)
    4. - 修改数值<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1582227432297-e84e3443-23d8-4f5f-b828-9f0cbdbdad3a.png#crop=0&crop=0&crop=1&crop=1&height=297&id=Q6sfr&name=image.png&originHeight=297&originWidth=495&originalType=binary&ratio=1&rotation=0&showTitle=false&size=18030&status=done&style=none&title=&width=495)
    5. - 保持使用(每过一天将数字增加1,表示在这个天时注册)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1582227449769-9fc151b1-fc7b-4410-80b1-b3a4f7b9aad1.png#crop=0&crop=0&crop=1&crop=1&height=244&id=zdCWJ&name=image.png&originHeight=244&originWidth=563&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33976&status=done&style=none&title=&width=563)

    电源电池充电最大设置

    1. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1592545434959-be078415-c63d-490c-a104-614d13e7834e.png#crop=0&crop=0&crop=1&crop=1&height=194&id=d7VpV&margin=%5Bobject%20Object%5D&name=image.png&originHeight=387&originWidth=951&originalType=binary&ratio=1&rotation=0&showTitle=false&size=66931&status=done&style=none&title=&width=475.5)

    数据库中文乱码

    1. - [完整解决方案](https://blog.csdn.net/qq_39240270/article/details/86603715)
    2. - [文件位置](https://blog.csdn.net/nihang1234/article/details/81872584)
    3. - 重启mysql服务器可以直接在任务管理器进行