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

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

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