zoukankan      html  css  js  c++  java
  • 【MySQL】常用总结(一)


    阅读目录

    一、分页

    二、锁表

    三、select in不存在数据

    一、分页

    1.LIMIT分页

    MySQL一般使用 LIMIT 实现分页。基本语句为:

    SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
    

    在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。

    举例来说,如果实际SQL类似下面语句,那么在 category_id, id两列上建立复合索引比较好:

    SELECT * FROM articles WHERE category_id=123 ORDER BY id LIMIT 50, 10 ;
    

    随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似下面这种:

    SELECT * FROM articles WHERE category_id=123 ORDER BY id LIMIT 10000, 10;
    

    2.子查询

    可以看出,越往后分页,LIMIT 语句的偏移量就会越大,速度也会明显变慢。此时,我们可以通过子查询的方式来提高分页效率:

    SELECT * FROM articles WHERE id >=
    (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) 
    AND category_id = 123 ORDER BY id LIMIT 10;
    

    3.JOIN

    还可以通过 JOIN 方式来实现分页查询:

    SELECT * FROM articles AS t1 
    JOIN (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) AS t2 
    WHERE t1.id >= t2.id AND t1.category_id = 123 ORDER BY t1.id LIMIT 10;
    

    子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。

    实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

    4.总结

    下面是实际中三种方式的使用:

    SELECT * FROM CommodityInfo WHERE commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 0,2;
    
    SELECT * FROM CommodityInfo WHERE id >=
    (SELECT id FROM CommodityInfo  WHERE commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 0, 1) 
    AND commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 2;
    
    SELECT * FROM CommodityInfo AS t1 
    JOIN (SELECT id FROM CommodityInfo WHERE commodityid = 'ZMCOMD342161018143038124' ORDER BY id LIMIT 0, 1) AS t2 
    WHERE t1.id >= t2.id AND t1.commodityid='ZMCOMD342161018143038124' ORDER BY t1.id LIMIT 2;
    

    二、锁表

    1.原因

    alert table时,table有未完成事务的提交,具体详情借鉴:metadata lock 原因

    2.解决

    1.show processlist   (查看所有进程列表)
       - state: Waiting for table metadata lock  
    
    2.kill 'Id'          (杀掉所有上述state信息)
    
    3.如未恢复正常,重启mysql
    

    三、select in不存在数据

    1.场景

    {ids: [1,2,3]} ,查询ids对应数组在mysql table中不存在的值
    

    2.解决方案

    2.1代码筛查

    1.查询存在数据库中的数据
    select id from table where id in (1,2,3)
    
    2.遍历查询的结果,与ids对应数据比较得出不存在的值
    

    2.2查询返回不存在数据

    将ids数据构造成一个临时表的一列数据,然后这一列数据不存在实际table表中的数据

    select id from 
        (SELECT 1 `id` FROM DUAL UNION ALL  SELECT 2 `id` FROM DUAL UNION ALL SELECT 3 `id` FROM DUAL) as tb1 
    WHERE id NOT IN(SELECT id FROM table WHERE id in (1,2,3))
    
  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/13207335.html
Copyright © 2011-2022 走看看