MySQL创建index提高多表查询效率

 将模型简单化,假设有三个表:tblA, tblB, tblC. 每个表包含三列:col1, col2, col3. 表的其它属性不考虑。

在不创建index的情况下,我们使用以下语句关联三个表:

  1. SELECT 
  2.    * 
  3. FROM 
  4.    tblA, 5       tblB, 6       tblC 7    WHERE 
  5.        tblA.col1 = tblB.col1 9       AND tblA.col2 = tblC.col1; 

对该语句使用EXPLAIN命令查看其处理情况: 

   +-------+------+---------------+------+---------+------+------+-------------+
   | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
   +-------+------+---------------+------+---------+------+------+-------------+
   | tblA  | ALL  | NULL          | NULL |    NULL | NULL | 1000 |             |
   | tblB  | ALL  | NULL          | NULL |    NULL | NULL | 1000 | Using where |
   | tblC  | ALL  | NULL          | NULL |    NULL | NULL | 1000 | Using where |
   +-------+------+---------------+------+---------+------+------+-------------+

关于EXPLAIN命令中,各个参数的具体含义,详解见ali的博文

[http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html]

查询机制 

对于命令的查询机制,可以参照下MySQL manual(7.2.1)中的一段说明:

The tables are listed in the output in the order that MySQL would read them while processing the query. MySQL resolves all joins using a single-sweep multi-join method. This means that MySQL reads a row from the first table, then finds a matching row in the second table, then in the third table, and so on. When all tables are processed, MySQL outputs the selected columns and backtracks through the table list until a table is found for which there are more matching rows. The next row is read from this table and the process continues with the next table.

正如上面所说,MySQL按照tblA, tblB, tblC的顺序依次读取数据,从EXPLAIN输出的信息结构看,之前的表查询的数据用来查找当前表对应的内容。即用tblA的值来查找tblB中满足条件的值,tblB的值用来查找tblC中满足条件的值。而当一次查找完成时(即三个表的值都查找过一次),MySQL并不会重新返回到tblA中的下一个数据重新开始,而是继续返回到tblB中的数据,来看tblB中是否还有其它行的值和tblA相匹配,如果有的话,继续到tblC,重复刚才的过程。这整个过程的关键原则就是:使用前一个表查询的数据来查找当前表对应的内容。

 

了解到MySQL在执行多表查询时使用前一个表查询的数据来查找当前表对应的内容这一原理后,那么创建Index的目的就是告诉MySQL怎么去直接找到下一个表的对应数据,如何按照MySQL需要的数据顺序来关联(JOIN)一个表。

再拿刚才的例子,tblA和tblB两个表通过条件 ”tblA.col1 = tblB.col1” 关联起来。我们首先获得tblA.col1,接下来MySQL需要的是来自tblB.col1的值,所以我们为它创建INDEX tblB.col1. 创建index后再次EXPLAIN之前的查询命令如下:

[[82940]]

   +-------+------+---------------+----------+---------+-----------+------+-------------+
   | table | type | possible_keys | key      | key_len | ref       | rows | Extra       |
   +-------+------+---------------+----------+---------+-----------+------+-------------+
   | tblA  | ALL  | NULL          | NULL     |    NULL | NULL      | 1000 |             |
   | tblB  | ref  | ndx_col1      | ndx_col1 |       5 | tblA.col1 |    1 | Using where |
   | tblC  | ALL  | NULL          | NULL     |    NULL | NULL      | 1000 | Using where |
   +-------+------+---------------+----------+---------+-----------+------+-------------+

[[82940]]

从结果中可以看出,MySQL现在使用key ‘ndx_col1’来关联tblB到tblA。也就是说,当MySQL查找tblB中的各行数据时,它直接使用key ‘ndx_col1’ 对应的tblA.col1来找到对应的行,而不是像之前那样进行全表扫描查找。

 

例子

举一个实例说明用法

其中USING选择的参数,要求是每个表所共有且在每个表中值不重复,以保证index***。

join (PRIMARY)中PRIMARY参数为Index名,

表的属性中,作为index需要将参数勾选PK属性,即Primary Key。

勾选telnum作为主键,需要将Default值中默认的NULL删除,PRIMARY_KEY不允许包含NULL值。

 

为每一个表创建了Index值后,EXPLAIN输出为:

对于MySQL,不管多复杂的查询,每次只需要按照EXPLAIN显示的顺序关联两张表中的内容。创建Index是为了让MySQL能够利用已经查找到的内容来快速找到下一张表的对应行内容。

原文链接:http://www.cnblogs.com/dwayne/archive/2012/07/06/MySQL_index_join_wayne.html

【编辑推荐】

  1. MySQL源码学习:MDL字典锁
  2. MySQL Cluster开发环境简明部署
  3. MySQL的四种不同查询的分析
  4. 甲骨文推出MySQL集群7.2
  5. MySQL内存表的特性与使用介绍

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/229867.html<

(0)
运维的头像运维
上一篇2025-04-18 23:29
下一篇 2025-04-18 23:31

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注