【问题标题】:What's a MySQL index table?什么是 MySQL 索引表?
【发布时间】:2009-05-08 19:21:04
【问题描述】:

我需要加快查询速度。我要找的是索引表吗?如果是这样,我该怎么做?每次插入都必须更新吗?

以下是表架构:

--table1--   |   --tableA--   |    --table2--
id           |   id           |    id
attrib1      |   t1id         |    attrib1
attrib2      |   t2id         |    attrib2
             |   attrib1      |

还有查询:

SELECT 
  table1.attrib1, 
  table1.attrib2,
  tableA.attrib1 
FROM 
  table1,
  tableA
WHERE 
  table1.id = tableA.t1id
  AND (tableA.t2id = x or ... or tableA.t2id = z)
GROUP BY 
  table1.id

【问题讨论】:

    标签: sql mysql indexing query-optimization


    【解决方案1】:

    你需要在tableA上创建一个复合索引:

    CREATE INDEX ix_tablea_t1id_t2id ON table_A (t1id, t2id)
    

    MySQL 中的索引被认为是表的一部分:它们会自动更新,并在优化器认为使用它们是一个好的举措时自动使用。

    MySQL 不使用术语index table

    Oracle 使用该术语来指代其他数据库所称的CLUSTERED INDEX:一种表,其中记录本身根据列(或一组列)的值排列。

    MySQL:

    • 当您使用MyISAM 存储时,索引会创建为具有.MYI 扩展名的单独文件。

      这个文件的内容代表一个B-Tree,每个叶子包含索引键和指向包含数据的.MYD文件中的偏移量的指针。

      指针的大小由名为myisam_data_pointer_size 的服务器设置决定,它可以从27 字节变化,自MySQL 5.0.6 以来默认为6

      这允许创建MyISAM 最多2 ^ (8 * 6) bytes = 256 TB 的表

    • InnoDB 中,所有表都按PRIMARY KEY 固有排序,它不支持堆组织表。

      因此,每个索引实际上只是一个普通的InnoDB 表,由N+M 记录中的一个PRIMARY KEY 组成:N 记录是索引值,M 记录是PRIMARY KEY保存索引数据的主表记录。

    【讨论】: