afredlyj / mynote

idea and note
1 stars 0 forks source link

mysql #3

Open afredlyj opened 8 years ago

afredlyj commented 8 years ago

Mysql filesort 的分析

首先,order by语法中,有些情况下会走索引,有些情况下不会走索引,这里有详细的说明。

Innodb 的聚簇索引

Innodb 在order by id中,不走索引的问题,5.0已经修复——bug

每个Innodb的数据表都有一个被称为clustered index的索引(聚簇索引),聚簇索引的选择有如下原则:

  1. 如果设置了primary key,则primary key就是聚簇索引;
  2. 如果表没有定义一个 PRIMARY KEY ,MySQL 将选出第一个 NOT NULL 字段的 UNIQUE 键做为主键,该主键为聚簇索引;
  3. 如果表中没有这样的键,InnoDB 将在内部产生一个聚簇索引,它是由按 InnoDB 分配给它们的 row id 顺序排序的记录行组成。这个 row id 是一个单调地增加并插入新行的 6-byte 字段。因而由 row id 排序的记录顺序也就是插入时的物理顺序。

详细信息可以参考这里。 当表有聚簇索引时,它的数据实际上存放在索引的叶子叶。 除聚簇索引之外的索引,都被称为二级索引(Secondary Indexes)。

afredlyj commented 8 years ago

索引的选择性

不重复的索引值(也成为基数)和数据表的记录总数(#T)的比值,范围从1/#T到1。该值越高,查询效率越高,因为这样的索引可以让mysql在查找时过滤更多的行。

前缀索引

覆盖索引

在Mysql中,可以通过索引直接获取列的数据,不需要根据索引找到数据行,然后再读取数据行。如果一个索引包含(或者覆盖)所有需要查询的字段的值,就成为覆盖索引。