现在的位置: 首页 > 综合 > 正文

MySQL中单列索引和多列索引的区别

2014年09月29日 ⁄ 综合 ⁄ 共 996字 ⁄ 字号 评论关闭

单列索引:只在单独的列上边建立索引

CREATE TABLE `multi_indexs` (
  `name` varchar(11) NOT NULL,
  `year` varchar(11) NOT NULL,

  KEY `name` (`name`),
  KEY `year` (`year`)
)

多列索引:在多个列上边建立一个索引,也称为组合索引;

CREATE TABLE `multi_column_index` (
  `name` varchar(11) NOT NULL,
  `year` varchar(11) NOT NULL,

  KEY `index` (`name`,`year`)
)

索引合并:是在MySQL 5.0及更新版本引入的一种策略,可以使用一个表中的多个单列索引。就是MySQL在处理查询时自动加入的一些查询优化,索引合并策略更多的说明了表上边索引建立的比较糟糕。

多列索引(组合索引)中列的顺序非常重要,顺序由选择性来确定,选择性高的放在前边。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:
Index Selectivity = Cardinality / #T

比较抽象,具体的例子就是:

SELECT  COUNT(DISTINCT name)/COUNT(*) AS name_selectivity,
	COUNT(DISTINCT yesr)/COUNT(*) AS year_selectivity
FROM multi_column_index;

name_selectivity和year_selectivity哪个值大就是哪列的选择性高。

很明显选择性越高那么第一次取出来的记录集就越小,再进行第二次查询的次数就越少了。

另外MySQL仅能对索引最左边的前缀进行有效的查找。例如:假设存在组合索引 index(name,year),查询语句 SELECT * FROM multi_column_index WHERE name='hello' AND year='21'能够使用该索引。查询语句 SELECT * FROM multi_column_index WHERE name='world'也能够使用该索引。但是,查询语句 SELECT * FROM
multi_column_index WHERE year='22'不能够使用该索引,因为没有组合索引的引导列,即,要想使用year列进行查找,必需出现name等于某值。

抱歉!评论已关闭.