• MySQL性能优化实践:SQL查询优化之使用只读索引、IN方法和临时表分批查询(附加:索引的创建删除命令)


    前言

    在处理大量数据时,MySQL的性能可能面临瓶颈。为了提升查询效率,本文将介绍三种优化SQL查询的方法:只读索引、IN方法和临时表分批查询。通过Java示例代码和讲解,帮助读者理解并应用这些优化技巧,提升MySQL查询性能。

    案例讲解

    我们将从以下三个案例来详细讲解这些优化方法。索引的创建删除命令:

    #explain 解释函数
    type结果值从好到坏依次是:
    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > 
    unique_subquery > index_subquery > range > index > ALL
    一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
    
    # 创建和删除索引
    1. 普通索引 添加INDEX
       ALTER TABLE table_name ADD INDEX index_name (column);CREATE INDEX index_name ON table_name (column);
    
    2. 主键索引 添加PRIMARY KEY
       ALTER TABLE table_name ADD PRIMARY KEY (column);ALTER TABLE table_name ADD CONSTRAINT pk_constraint_name PRIMARY KEY (column);
    
    3. 唯一索引 添加UNIQUE
       ALTER TABLE table_name ADD UNIQUE (column);CREATE UNIQUE INDEX index_name ON table_name (column);
       
    4. 全文索引 添加FULLTEXT
       ALTER TABLE table_name ADD FULLTEXT (column);CREATE FULLTEXT INDEX index_name ON table_name (column);
    
    5. 如何添加复合索引
       ALTER TABLE table_name ADD INDEX index_name (column1, column2, column3);CREATE INDEX index_name ON table_name (column1, column2, column3);
    
    6. 删除索引
       DROP INDEX index_name ON table_name;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    案例一:只读索引的优化方法

    只读索引是一种优化方法,通过将索引设置为只读,降低对表的访问,提升查询性能。它适用于查询较多、更新较少的情况。下面是一个示例演示只读索引的优化方法:

    public interface MemberMapper {
    	//优化前查询
        List<Member> selectMembersWithoutIndex();
        //优化后查询
        List<Member> selectMembersWithIndex();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    <select id="selectMembersWithoutIndex" resultType="Member">
        SELECT c1, c2, cn ... FROM member ORDER BY last_active LIMIT 50,5
    select>
    
    <select id="selectMembersWithIndex" resultType="Member">
        SELECT c1, c2, cn ... FROM member
        INNER JOIN (SELECT member_id FROM member ORDER BY last_active LIMIT 50, 5) t USING (member_id)
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这个示例中:

    1. 优化前的SQL查询语句会导致先对整张表进行排序和限制,然后再将数据返回,可能产生大量的I/O浪费,因为数据库需要读取并丢弃不需要的行。
    2. 而优化后的SQL查询语句则通过使用INNER JOIN与子查询,其中子查询的member_id设置了只读索引,避免了对整张表的直接排序和限制,而是只对子查询得到的结果进行操作,从而减少了不必要的I/O操作,提升了查询效率和性能。

    常见问答:

    1. 问:什么是只读索引?为什么要使用它来优化MySQL性能?
      答:只读索引是一种将索引设置为只读的优化方法,通过降低对表的访问,提升查询性能。它适用于查询操作较多、更新操作较少的情况。使用只读索引可以减少对表的锁定和IO操作,从而提高查询效率。

    案例二:IN方法进行ID查询

    IN方法是查询时使用的一种优化方法,特别适用于根据大量ID值进行查询的场景。它避免了一次性查询大量ID值的性能问题。以下是使用IN方法进行ID查询的示例:

    public interface MyMapper {
        List<MyObject> queryRecordsUsingIn(List<Integer> ids);
    }
    
    • 1
    • 2
    • 3
    <select id="queryRecordsUsingIn" resultMap="recordResultMap" parameterType="java.util.List">
        SELECT c1, c2, cn
        FROM original_table
        WHERE id IN
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        foreach>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    常见问答:

    1. 问:为什么要使用IN方法进行ID查询?有何优势?
      答:使用IN方法进行ID查询可以避免一次性查询大量ID值带来的性能问题。它可以根据ID值集合进行匹配,无需一次性处理整个大量ID值列表。这样可以减少数据库的负载和查询的响应时间。

    案例三:临时表分批查询大量ID值

    对于需要查询大量ID值的情况,临时表和分批查询是一种有效的优化方法。下面是使用临时表和分批查询的示例:

    public interface MyMapper {
        List<MyObject> queryRecordsUsingTempTable();
    }
    
    • 1
    • 2
    • 3
    <select id="queryRecordsUsingTempTable" resultMap="recordResultMap">
        <sql>
            CREATE TEMPORARY TABLE temp_ids (id INT);
            INSERT INTO temp_ids (id) VALUES (1), (2), (3), ...;
        sql>
        SELECT t.c1, t.c2, t.cn
        FROM temp_ids temp
        INNER JOIN original_table t ON t.id = temp.id;
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    常见问答:

    1. 问:为什么要使用临时表和分批查询大量ID值?有何好处?
      答:使用临时表和分批查询可以有效处理大量ID值的查询。通过创建临时表并将ID值插入其中,然后与原始表进行连接,可以避免一次性查询和处理整个大量ID值列表的性能问题。这样可以减少数据库的负载和查询的执行时间。

    总结和推荐

    通过本文介绍的只读索引、IN方法和临时表分批查询这三种优化方法,你可以提升MySQL的查询性能。根据实际需求和场景,选择合适的优化方法,可以获得更好的查询体验。

  • 相关阅读:
    2022/08/27 吉软 Vue
    数据分析利器---jupyter
    HBase shell常用命令
    Linux 进程控制
    Linux基础篇-逻辑卷管理
    【软件测试】Postman中变量的使用
    AWS SAA-C03 #38
    (六)React Ant Design Pro + .Net5 WebApi:后端环境搭建-EF Core
    无涯教程-JavaScript - DELTA函数
    C++ Tutorials: C++ Language: Classes: Polymorphism
  • 原文地址:https://blog.csdn.net/Da_zhenzai/article/details/134274704