精华内容
下载资源
问答
  • sql技术
    千次阅读
    2022-03-21 13:51:08

            近期写博客和上论坛的时间少了,很多时候在QQ群里交流,QQ群号:195233677

     

    更多相关内容
  • sql技术说明

    2018-03-08 18:40:34
    sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明sql技术说明
  • SQL技术手册PDF版

    千次下载 热门讨论 2010-11-30 11:26:45
    SQL技术手册,重新整理标签,PDF完美版,学习SQL经典材料。
  • [曾贤志]-Excel数据透视表与SQL技术

    千人学习 2017-08-26 10:32:18
    本课主要讲解了数据透视表的应用,之后再结合SQL的应用。
  • 资源包含:【Microsoft SQL Server 2008技术内幕:T-SQL语言基础】PDF文件和跟书本匹配的源码,方便大家学习并实践。 本书是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL ...
  • 动态sql

    千次阅读 2022-06-04 13:07:28
    动态sql

    1.什么是动态sql

    sql的内容是变化的, 可以根据条件获取到不同的sql语句.
    主要是where部分发生变化。
    动态sql的实现, 使用的是mybatis提供的标签

    2.为什么使用动态sql

    使用动态sql可以解决某些功能的使用 例如使用条件查询某个商品 你输入价格,地区等等进行筛选,如果使用静态sql可能会查询出来的是一个空内容 但使用动态sql可以很好的解决这种问题 例如
    在这里插入图片描述

    3.动态sql的标签

    在这里插入图片描述

    3.1 if标签-单条件判断

    作用:筛选条件语句
    dao层方法为:

    public User findConditon(@Param("name")String name, @Param("email")String email);
    

    mapper层

     <!--如果姓名不为空则安姓名查找 如果姓名为空则按邮箱查找 否则查询全部-->
        <select id="findConditon" resultType="com.wx.entity.User">
            select * from tbl_user02
            <where>
                <if test="name!=null and name!=''">
                    and name = #{name}
                </if>
                <if test="email!=null and email!=''">
                    and email = #{email}
                </if>
            </where>
        </select>
    

    3.2 choose标签 多条件分支判断

    //当三者不为空的时候 按姓名 密码 邮件查询 三个条件都会执行一遍
    public User findByCondition(@Param("name")String name, @Param("email")String email,
                                    @Param("pwd")String pwd);
                                    
    
    <select id="findByCondition" resultType="com.wx.entity.User">
            select * from tbl_user02
            <where>
                <choose>
                    <when test="name!=null and name!=''">
                        and name = #{name}
                    </when>
                    <when test="email!=null and email!=''">
                        and email = #{email}
                    </when>
                    <otherwise>
                        and pwd = #{pwd}
                    </otherwise>
                </choose>
            </where>
        </select>
    

    3.3 where语句

    如果不使用where语句 就要在where其他判断语句前加入1=1 如 select * from tbl_user02 where 1=1加其他的if判断语句 如果我们不加入这个1=1就可以直接使用where语句 上面的choose和if都搭配使用 使用where 语句 可以自动消除第一个条件中的and 且加上where 例子如上面两个标签中即可

    3.4set标签

    这个标签配合if标签一起用 一般用于修改语句 如果传递的参数为null 那么就不会修改该列的值

     public int updateUser(User user);
    
    
    //这里注意 test="参数" 这里的参数 是前端传过来的值就是你前端页面上是什么 这里就要写什么 
    //而下面的name=#{name} 第一个name是你数据库中的字段 #{name}中是你的前端传过来的值
    <update id="updateUser" parameterType="User">
            update tbl_user02
            <set>
                <if test="name!=null and name!=''">
                    name=#{name},
                </if>
                <if test="pwd!=null">
                    pwd=#{pwd},
                </if>
                <if test="email!=null">
                    email=#{email},
                </if>
            </set>
            where id = #{id}
        </update>
    

    3.4foreach标签

    循环标签 适用于批量添加、删除 和查询记录

    3.4.1用于批量查询

    查询id为1 3 5 的用户信息
    正常sql语句为 select * from tbl_user02 where id in(1,3,5);
    下面的为使用foreach遍历 循环查询
        解释:
        <foreach collection="集合类型" open="开始的字符" close="结束的字符"
    	    item="集合中的成员" separator="集合成员之间的分割符">
            #{item的值}
        </foreach>
       标签属性:
       collection:表示循环的对象是数组还是list集合。如果dao方法的形参是数组,collection="array";
    		如果dao方法形参是list,collection="list";
       open:循环开始的字符。sql.append("(");
       close:循环结束的字符。sql.append(")");
       item:集合成员,自定义的变量。Integer item = idList.get(i);
       separator:集合成员之间的分隔符。sql.append(",");
       #{item的值}:获取集合成员的值;
    

    具体代码实现
    dao层

    //传递的参数为id数组所以mapper层的collection="list"
    public List<User> findByIds(Integer[] ids);
    

    mapper层为

        <select id="findByIds" resultType="com.wx.entity.User">
            select * from tbl_user02 where id in
            <foreach collection="array" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </select>
    

    测试类为:

    @Test
        public void testFindByIds() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            Integer[] ids = {1,3,5};
            List<User> user = userDao.findByIds(ids);
            System.out.println(user);
            session.close();
        }
    

    查询出三条记录
    在这里插入图片描述

    3.4.2用于批量删除

    dao层

    public int BatchDelete(Integer[] ids);
    

    mapper层

      <delete id="BatchDelete">
            delete from tbl_user02 where id in
            <foreach collection="array" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </delete>
    

    测试类:

    @Test
        public void testBatchDelete() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            Integer[] ids = {1,3,5};
            int row = userDao.BatchDelete(ids);
            System.out.println(row);
            session.commit();
            session.close();
        }
    

    在这里插入图片描述

    3.4.3用于批量添加

    dao层

    public int batchAdd(List<User> users);
    

    mapper层

       <!--注意 因为循环添加的为一个对象 所以下面添加的值就必须是users.name ...-->
        <insert id="batchAdd">
            insert into tbl_user02(name,pwd,email) values
            <foreach collection="list" item="users" separator=",">
                (#{users.name},#{users.pwd},#{users.email})
            </foreach>
    
        </insert>
    

    测试类:

    @Test
        public void testBatchAdd() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            List<User> list = new ArrayList<User>();
            list.add(new User("张三","123","zs@qq.com"));
            list.add(new User("李四","123","ls@qq.com"));
            list.add(new User("王五","123","ww@qq.com"));
            int row = userDao.batchAdd(list);
            System.out.println(row);
            session.commit();
            session.close();
        }
    

    在这里插入图片描述

    3.4.4sql片段

    一般用于查询语句的时候 select * … 这种不推荐 所以用sql片段可以很好的解决这个问题
    在这里插入图片描述

    4.mybatis映射文件处理特殊字符.

    当我们使用条件语句查询的时候 就比如在某个范围中使用条件如 money>100 and money<200
    这个条件在mapper中无法直接写所以需要特殊处理,有两种解决办法:

       第一种:转义标签 &nbsp; &lt;  
       第二种: <![CDATA[sql]]>
    
    <select id="findByMaxAndMin" resultType="com.ykq.entity.Account">
           <![CDATA[select * from account where id >#{min} and id <#{max}]]>
    </select>
    

    第一种:转义字符处理
    dao层

     public User findByMaxAndMin(@Param("min") int min,@Param("max") int max);
    

    mapper层

     <select id="findByMaxAndMin" resultType="com.wx.entity.User">
            select * from tbl_user02 where id &gt;#{min} and id &lt; #{max}
        </select>
    

    测试类

        @Test
        public void testFindByMaxMin() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            User user = userDao.findByMaxAndMin(1, 3);
            System.out.println(user);
            session.commit();
            session.close();
        }
    

    在这里插入图片描述
    第二种: <![CDATA[sql]]>

    dao层

    public User findByMaxAndMin01(@Param("min") int min,@Param("max") int max);
    

    实体层

    <select id="findByMaxAndMin01" resultType="com.wx.entity.User">
             <![CDATA[select * from tbl_user02 where id>#{min} and id<#{max}]]>
        </select>
    

    测试类

     @Test
        public void testFindByMaxMin01() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            User user = userDao.findByMaxAndMin01(1, 3);
            System.out.println(user);
            session.commit();
            session.close();
        }
    

    在这里插入图片描述

    5.mybatis完成模糊查询

    语法:select * from 表名 where 列名 like ‘%a%’ 但是% a %这样在mapper层无法使用 解决办法有两种
    第一种:使用字符串函数(concat)完成拼接
    dao层

        /*模糊查询*/
        public User findByName(@Param("name")String name);
    

    mapper层

    <select id="findByName" resultType="com.wx.entity.User">
            select * from tbl_user02 where name like concat('%',#{name},'%');
        </select>
    

    测试类

        @Test
        public void testFindByName() throws Exception{
            Reader rd = Resources.getResourceAsReader("conf.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(rd);
            SqlSession session = factory.openSession();
            UserDao userDao = session.getMapper(UserDao.class);
            User user = userDao.findByName("李");
            System.out.println(user);
            session.close();
        }
    

    在这里插入图片描述
    第二种:使用${}

     <select id="findByName" resultType="com.wx.entity.User">
            select * from tbl_user02 where name like '%${name}%';
        </select>
    

    两者区别:concat不能解决sql注入的问题 第二种是预编译 可以解决sql注入问题

    展开全文
  • [Microsoft Press] Microsoft SQL Server 2012 技术内幕 (英文版) [Microsoft Press] Microsoft SQL Server 2012 Internals (E-Book) ☆ 图书概要:☆ Dive deep inside the architecture of SQL Server 2012 ...
  • 如果把学习SQL Server 数据库技术,比作修炼武功,那么技术内幕系列书籍可以称为独孤九剑。这是我最喜欢的,也是我经常推荐给别人的。2005 总共4本,后续的版本有几本呢?SQL Server 2012技术内幕有哪几本?2012以后...

    前言

    如果把学习SQL Server 数据库技术,比作修炼武功,那么技术内幕系列书籍可以称为独孤九剑。这是我最喜欢的,也是我经常推荐给别人的。2005 总共4本,后续的版本有几本呢?SQL Server 2012技术内幕有哪几本?2012以后的版本呢呢?


    SQL Server 2005 

    在这个版本技术内幕系列书籍共有4本。

    T-SQL程序设计 ,T-SQL查询 、 存储引擎、、查询调整及优化。
    前面2本主要有Itzik Ben-gan编写 , 主要偏向于开发,  后面2本主要由 Kalen Delaney编写,偏向于性能调优和架构。这2位大神都是大牛就不介绍了



    SQL SERVER 2008

    从这里开始 前面2本,由于Itzik Ben-gan 编写的名字还是叫inside Sql Server 2008 


    而后面的2本就变成一本了,SQL Server 2008 Internals


    SQL Server 2012


    后面2本 变成了Microsoft SQL Server 2012 Internals 。这个版本目前没有中文版。我打算在博客分享下这边书的读书笔记。


    为什么改名

    根据作者的说法的,INSIDE这个词语已经被用烂了,甚至被其他书占用了,所以就修改了名字。所以直接搜索SQL SERVER 2012技术内幕前面2本可能搜索不到。我

    2012以后的版本

    由于作者认为2012以后的更新太少,所以2012 以后的没有更新了




    展开全文
  • sqlserver2005技术内幕中文,pdf版,文字清晰,4本全。 建议观看顺序:1、T-SQL查询;2、T-SQL程序设计;3、存储引擎;4、查询、调整和优化
  • SQL Server 技术内幕之T-SQL编程原版CHM SQL Server 2005 技术内幕四本中的其一 本书是Inside Microsoft SQL Server 2005系列四本著作中的一本。它详细介绍了T-SQL的内部构造,包含了非常全面的编程参考。它提供了...
  • Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    千次下载 热门讨论 2012-06-23 13:18:33
    本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...
  • Microsoft SQL Server 2008技术内幕完整版
  • Microsoft SQL Server 2005技术内幕:存储引擎(中文).pdf

    千次下载 热门讨论 2012-06-23 13:15:03
    您将跟随一位广受欢迎的作家同时也是SQL Server资深专家一起深入探索SQL Server存储引擎的技术内幕。  本书适合于专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者。本书不仅适合...
  • 文章目录一、什么是慢SQL ?二、为什么要对慢SQL进行优化?三、数据库性能1. 最大数据量2. 最大并发数3. 查询耗时0.5秒4. 具体实施四、数据库表的设计1. 数据类型2. 避免空值3. text 类型优化五、索引优化1. 索引...

    一、什么是慢SQL ?

    分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。

    慢查询日志就是记录这些sql的日志。

    查看/设置“慢查询”的时间定义:

    show variables like "long%";
    

    在这里插入图片描述
    如上述语句输出,“慢查询”的时间定义为10秒(方便测试,一般设置为1-10秒)。

    使用下面语句定义“慢查询”时间

    set long_query_time=0.0001;
    

    开启“慢查询”记录功能

    show variables like "slow%";
    

    在这里插入图片描述
    上述语句查看“慢查询”的配置信息,你可以自定义日志文件的存放,但必须将 slow_query_log 全局变量设置为“ON”状态,执行以下语句:

    set global slow_query_log=ON;
    

    在这里插入图片描述

    二、为什么要对慢SQL进行优化?

    每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短。

    假设总资源是10,有一条慢SQL占用了3的资源共计1分钟。

    那么在这1分钟时间内,其他SQL能够分配的资源总量就是7,如此循环,当资源分配完的时候,所有新的SQL执行将会排队等待。

    从应用的角度看:SQL执行时间长意味着等待,在OLTP应用当中,用户的体验较差

    三、数据库性能

    1. 最大数据量

    抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。
    在这里插入图片描述
    《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。

    性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。

    分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分

    2. 最大并发数

    并发数是指同一时刻数据库能处理多少个请求,由max_connectionsmax_user_connections决定。

    max_connections是指MySQL实例的最大连接数,上限值是16384,max_user_connections是指每个数据库用户的最大连接数。

    MySQL会为每个连接提供缓冲区,意味着消耗更多的内存。

    如果连接数设置太高硬件吃不消,太低又不能充分利用硬件。

    一般要求两者比值超过10%,计算方法如下:

    max_used_connections / max_connections * 100% = 3/100 *100%3%
    

    查看最大连接数与响应最大连接数:

    show variables like '%max_connections%';
    show variables like '%max_user_connections%';
    

    在配置文件my.cnf中修改最大连接数

    [mysqld]
    max_connections = 100
    max_used_connections = 20
    

    3. 查询耗时0.5秒

    建议将单次查询耗时控制在0.5秒以内,0.5秒是个经验值,源于用户体验的3秒原则

    如果用户的操作3秒内没有响应,将会厌烦甚至退出。

    响应时间=客户端UI渲染耗时+网络请求耗时+应用程序处理耗时+查询数据库耗时,0.5秒就是留给数据库1/6的处理时间。

    4. 具体实施

    相比NoSQL数据库,MySQL是个娇气脆弱的家伙。

    它就像体育课上的女同学,一点纠纷就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL约束太多)。

    如今大家都会搞点分布式,应用程序扩容比数据库要容易得多,所以实施原则是数据库少干活,应用程序多干活。

    • 充分利用但不滥用索引,须知索引也消耗磁盘和CPU。
    • 不推荐使用数据库函数格式化数据,交给应用程序处理。
    • 不推荐使用外键约束,用应用程序保证数据准确性。
    • 写多读少的场景,不推荐使用唯一索引,用应用程序保证唯一性。
    • 适当冗余字段,尝试创建中间表,用应用程序计算中间结果,用空间换时间。
    • 不允许执行极度耗时的事务,配合应用程序拆分成更小的事务。
    • 预估重要数据表(比如订单表)的负载和数据增长态势,提前优化。

    或者:

    • 将数据存放在更快的地方。

    • 如果数据量不大,变化频率不高,但访问频率很高,此时应该考虑将数据放在应用端的缓存当中或者Redis这样的缓存当中,以提高存取速度。如果数据不做过滤、关联、排序等操作,仅按照key进行存取,且不考虑强一致性需求,也可考虑选用NoSQL数据库。

    • 适当合并I/O

      • 分别执行select c1 from t1与select c2 from t1,与执行select c1,c2 from t1相比,后者开销更小
      • 合并时也需要考虑执行时间的增加。
    • 利用分布式架构:在面对海量的数据时,通常的做法是将数据和I/O分散到多台主机上去执行

    • 不在业务高峰期批量更新或查询数据库,避免在业务高峰期alter表。

    • 禁止在主库上执行 sum,count 等复杂的统计分析语句,可以使用从库来执行。

    • 禁止使用 order by rand().

    • 禁止单条 SQL 语句同时更新多个表。

    • 使用 prepared statement 语句,只传参数,比传递 SQL 语句更高效;一次解析,多次使用;降低SQL

    • 事务要简单,整个事务的时间长度不要太长,SQL结束后及时提交。

    • SQL语句尽可能简单 大SQL语句尽可能拆成小SQL语句,MySQL对复杂SQL支持不好。

    四、数据库表的设计

    1. 数据类型

    数据类型的选择原则:更简单或者占用空间更小。

    • 如果长度能够满足,整型尽量使用 tinyint、smallint、medium_int 而非int。
    • 如果字符串长度确定,采用char类型。
    • 如果varchar能够满足,不采用text类型。
    • 精度要求较高的使用 decimal 类型,也可以使用 BIGINT,比如精确两位小数就乘以100后保存。
    • 尽量采用 timestamp 而非 datetime。
      在这里插入图片描述

    相比 datetime,timestamp 占用更少的空间,以UTC的格式储存自动转换时区。

    2. 避免空值

    MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。

    从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。

    尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含is not null的判断

    3. text 类型优化

    由于text字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。

    建议抽取出来放在子表里,用业务主键关联。

    五、索引优化

    1. 索引分类

    普通索引:最基本的索引。

    组合索引:多个字段上建立的索引,能够加速复合查询条件的检索。

    唯一索引:与普通索引类似,但索引列的值必须唯一,允许有空值。

    组合唯一索引:列值的组合必须唯一。

    主键索引:特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用primary key约束。

    全文索引:用于海量文本的查询,MySQL5.6之后的InnoDB和MyISAM均支持全文索引,由于查询精度以及扩展性不佳,更多的企业选择Elasticsearch。

    2. 索引优化

    分页查询很重要,如果查询数据量超过30%,MYSQL不会使用索引。

    单表索引数不超过5个、单个索引字段数不超过5个。

    字符串可使用前缀索引,前缀长度控制在5-8个字符。

    字段唯一性太低,增加索引没有意义,如:是否删除、性别。

    合理使用覆盖索引,如下所示:

    select login_name, nick_name from member where login_name = ?
    

    login_name, nick_name两个字段建立组合索引,比login_name简单索引要更快。

    六、SQL 优化

    1. 分批处理

    鱼塘挖开小口子放水,水面有各种漂浮物。
    浮萍和树叶总能顺利通过出水口,而树枝会挡住其他物体通过,有时还会卡住,需要人工清理。
    MySQL就是鱼塘,最大并发数和网络带宽就是出水口,用户SQL就是漂浮物。

    不带分页参数的查询或者影响大量数据的update和delete操作,都是树枝,我们要把它打散分批处理

    举例说明:
    业务描述:更新用户所有已过期的优惠券为不可用状态。

    update status=0 FROM `coupon` WHERE expire_date <= #{currentDate} and status=1;
    

    如果大量优惠券需要更新为不可用状态,执行这条SQL可能会堵死其他SQL,分批处理伪代码如下:

    int pageNo = 1;
    int PAGE_SIZE = 100;
    while(true) {
        List<Integer> batchIdList = queryList('select id FROM `coupon` WHERE expire_date <= #{currentDate} and status = 1 limit #{(pageNo-1) * PAGE_SIZE},#{PAGE_SIZE}');
        if (CollectionUtils.isEmpty(batchIdList)) {
            return;
        }
        update('update status = 0 FROM `coupon` where status = 1 and id in #{batchIdList}')
        pageNo ++;
    }
    

    2. 操作符<>优化

    通常<>操作符无法使用索引,举例如下,查询金额不为100元的订单:

    select id from orders where amount != 100;
    

    如果金额为100的订单极少,这种数据分布严重不均的情况下,有可能使用索引。

    鉴于这种不确定性,采用union聚合搜索结果,改写方法如下:

    (select id from orders where amount > 100)
     union all
    (select id from orders where amount < 100 and amount > 0)
    

    3. OR优化

    在Innodb引擎下or无法使用组合索引,比如:

    select id,product_name from orders where mobile_no = '13421800407' or user_id = 100;
    

    OR 无法命中mobile_no + user_id的组合索引,可采用union,如下所示:

    (select id,product_name from orders where mobile_no = '13421800407')
     union
    (select id,product_name from orders where user_id = 100);
    

    此时id和product_name字段都有索引,查询才最高效。

    4. IN优化

    IN适合主表大子表小,EXIST适合主表小子表大

    由于查询优化器的不断升级,很多场景这两者性能差不多一样了。

    尝试改为join查询,举例如下:

    select id from orders where user_id in (select id from user where level = 'VIP');
    

    采用 join 如下:

    select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP';
    

    5. 不做列运算

    通常在查询条件列运算会导致索引失效,如下所示:

    查询当日订单

    select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01';
    

    date_format 函数会导致这个查询无法使用索引,改写后:

    select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59';
    

    6. 避免Select all

    如果不查询表中所有的列,避免使用SELECT *,它会进行全表扫描,不能有效利用索引。

    7. Like优化

    在SQL中,尽量不使用like,且禁止使用前缀是%的like匹配。

    like用于模糊查询,举个例子(field已建立索引):

    SELECT column FROM table WHERE field like '%keyword%';
    

    这个查询未命中索引,换成下面的写法:

    SELECT column FROM table WHERE field like 'keyword%';
    

    去除了前面的%查询将会命中索引,但是产品经理一定要前后模糊匹配呢?全文索引fulltext可以尝试一下,但Elasticsearch才是终极武器。

    8. Join 优化

    避免使用大表做 JOIN,使用group by分组、自动排序

    join的实现是采用Nested Loop Join算法,就是通过驱动表的结果集作为基础数据,通过该结数据作为过滤条件到下一个表中循环查询数据,然后合并结果。

    如果有多个join,则将前面的结果集作为循环数据,再次到后一个表中查询数据。

    驱动表和被驱动表尽可能增加查询条件,满足ON的条件而少用Where,用小结果集驱动大结果集。

    被驱动表的join字段上加上索引,无法建立索引的时候,设置足够的Join Buffer Size。

    禁止join连接三个以上的表,尝试增加冗余字段。

    9. Limit 优化

    当只要一行数据时使用LIMIT 1 。

    limit用于分页查询时越往后翻性能越差,解决的原则:缩小扫描范围,如下所示:

    select * from orders order by id desc limit 100000,10 
    

    耗时0.4秒

    select * from orders order by id desc limit 1000000,10
    

    耗时5.2秒

    先筛选出ID缩小查询范围,写法如下:

    select * from orders where id > (select id from orders order by id desc  limit 1000000, 1) order by id desc limit 0,10
    

    耗时0.5秒

    如果查询条件仅有主键ID,写法如下:

    select id from orders where id between 1000000 and 1000010 order by id desc
    

    耗时0.3秒

    七、其他SQL

    在这里插入图片描述

    【参考】

    【1】https://zhuanlan.zhihu.com/p/394710746
    【2】https://cloud.tencent.com/developer/article/1523059
    【3】https://www.jianshu.com/p/6864abb4d885
    【4】https://database.51cto.com/art/202006/618217.htm
    【5】https://juejin.cn/post/6844903489676509197
    【6】https://www.jianshu.com/p/43091bfa8aa7
    【7】https://www.cnblogs.com/zjfjava/p/12257772.html

    展开全文
  • SQL技术手册(PDF)

    2007-04-29 12:50:36
    以前对SQL不太懂,看了以后感觉可以,讲的不错
  • Microsoft SQL Server 2005技术内幕:T-SQL查询的源代码,主要是SQL脚本
  • 安全测试|SQL注入技术

    千次阅读 2022-03-30 19:23:13
    SQL注入风险 前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行, 从而导致数据库受损(被拖库、被删除、甚至整个服务器权限沦陷) 有以下几个...
  • Microsoft SQL Server 2008技术内幕:T-SQL查询 自制完美书签
  • Text2Sql相关总结

    千次阅读 2020-07-30 10:37:02
    Text-to-SQL系统能够将自然语言描述转化成对应的SQL查询语句,这项技术能够有效地辅助人们对海量的数据库进行查询。因此,该项研究引起了工业界和学术界的广泛关注。其中,WikiSQL、Spider等大规模标注数据集进一步...
  • Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    千次下载 热门讨论 2012-06-23 13:13:10
     本系列图书中文版得到了微软总部SQL Server组专家的高度重视,同时也得到了微软中国上海SQL Server全球技术支持中心的高度关注。   本书详细介绍了T-SQL的内部构造,包含了非常全面的编程参考。数据库开发人员和...
  • C#SQL查询技术

    千人学习 2018-02-02 19:37:43
    本课程以SQL Server 2008 R2数据库系统为例,全面介绍SQL查询技术,包括select语句,Where子句,Order By子句,Group By子句,having语句,TOP和PERCENT限制查询结果,在查询中使用OR和AND运算符,聚合函数应用,多...
  • SQL数据库学习心得

    千次阅读 2021-11-07 08:52:28
    学习了SQL数据库中的增、删、改、查等功能,数据库这门课涉及到以前的知识不多,是一门从头学起的课程,即使基础不是很好,只要认真听讲、复习功课,还是一门比较容易掌握的课。 正是由于这门课和以前关系不大,很...
  • SQL Server数据库应用技术

    千次阅读 2017-09-09 01:14:50
    SQL Server数据库应用技术 SQL是Structured Query Language的缩写。SQL是为数据库而建立的操作命令集,是一种功能齐全的数据库语言。SQL功能强大、简单、易学、使用方便,已经成为了数据库操作的基础,并且现在几乎...
  • Microsoft SQL Server 2005技术内幕 查询、调整和优化.pdf
  • 大数据技术SQL

    千次阅读 2019-08-19 17:45:27
    大数据技术SQL的作用 SQL命令综述 DDL DML DCL & TCL 小结 前言 确实,关于SQL的学习资料,各类文档在网上到处都是。但它们绝大多数的出发点都局限在旧有关系数据库里,内容近乎千篇一律。而在当今...
  • SQL高级查询技术.doc

    千次下载 热门讨论 2013-01-04 16:27:50
    SQL高级查询技术.doc
  • SQL Server数据库技术大全.pdf

    热门讨论 2011-12-25 09:31:03
    SQL Server数据库技术大全PDF高清技术文档。。
  • 文章目录一、实验题目二、实验步骤及结果Task 1: Get Familiar with SQL StatementsTask 2: SQL Injection Attack on SELECT StatementTask 2.1: SQL Injection Attack from webpage.Task 2.2: SQL Injection Attack...
  • ——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...
  • sql server 2005 技术内幕 T-SQL查询》 《sql server 2005 技术内幕 T-SQL程序设计》 网上大多的资源都是英文的,好容易找到中文的了,上传上来和大家分享。 这两本书都是中文的(很不容易哟),是高清晰的pdf...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 711,864
精华内容 284,745
关键字:

sql技术

友情链接: UKF.rar