mysql建立组合索引原则

原创 2015年02月27日 09:42:10
现实中,mysql可以根据业务需要建立组合索引,由于mysql使用B-Tree格式索引,可以直接定位记录,无需扫描。mysql建立多列索引有最左前缀的原则,即最左优先,如:

如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上建立了索引;

如何建立组合索引?

最频繁使用的列放在左边;
查看列的选择性(即该列的索引值数量与记录数量的比值),比值越高,效果越好;

例如用户表,如果按照用户姓名查询比较多,可以考虑在根据姓名建立索引。这里有两种形式:1在用户的名字字段(name)在做索引。2,在用户的名字和姓氏字段建立索引(name+family_name)。我们查看了下name字段的选择性,执行如下语句。

SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM user; 
+-------------+


| Selectivity |
+-------------+
| 0.0052 |
+-------------+
发现值非常小,因为name相同的用户实在太多。 再查看下name+family_name的选择性。
SELECT count(DISTINCT(concat(name, family_name)))/count(*) AS Selectivity FROM user; 
+-------------+


| Selectivity |
+-------------+
| 0.9563 |
+-------------+
发现名字完全相同的员工基本没有。但是索引key如果太长会使得索引文件变大并且维护开销增大,name+family name的长度等于30,还是希望有一个艰巨选择性和长度的方案。 因此可以考虑在name和family前自己字符上面建立索引,例如 name + left(family_name,5):

SELECT count(DISTINCT(concat(name, left(family_name,5))))/count(*) AS Selectivity FROM user;
+-------------+


| Selectivity |
+-------------+
| 0.9012 |
+-------------+

虽然不如以name+family_name的选择性高,但是已经基本满足要求。


参考: http://www.lai18.com/content/312860.html

mysql 给表添加一个联合唯一索引

项目中需要用到联合唯一索引: 例如:user表中有user_
  • wq7570875
  • wq7570875
  • 2014年05月12日 14:11
  • 44334

MySQL_MySQL 联合索引详解 以及注意事项

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,...
  • u010003835
  • u010003835
  • 2016年06月02日 07:52
  • 5193

MySQL单列索引和组合索引的创建及区别介绍

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。   为了形象地对比两者,...
  • ssssny
  • ssssny
  • 2017年05月23日 14:19
  • 627

MySql 创建索引原则

为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。本小节将向读者介绍一些索引的设计原则。   1.选择唯一性索引   唯一性索引的值是唯一的,可以更快速的通过该...
  • CSDNones
  • CSDNones
  • 2015年12月27日 15:41
  • 2146

MySql 给表添加一个联合唯一索引

做项目需要用到联合唯一 例如,user表中有user_id,user_name两个字段,如果不希望有两条一摸一样的的user_id和user_name,需要给user表添加两个字段的联合唯一索引...
  • u010349417
  • u010349417
  • 2013年11月21日 18:24
  • 14935

MySQL单列索引和组合索引的区别介绍

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。   为了形象地对比两者,再建...
  • weiqubo
  • weiqubo
  • 2015年12月10日 23:30
  • 7418

mysql索引总结----mysql 索引类型以及创建

关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型...
  • xluren
  • xluren
  • 2014年06月20日 23:28
  • 206945

MySQL创建复合索引

在MySQL数据库中,创建复合索引的时候,不知道在创建过程中哪个列在前面,哪个列该在后面,用以下方式即可: select count(distinct first_name)/count(*) ...
  • haoge7777
  • haoge7777
  • 2016年01月29日 10:28
  • 1432

单键索引还是组合索引

转自 http://talentluke.iteye.com/blog/1843868 摘自http://book.51cto.com/art/200906/132406.htm ...
  • linminqin
  • linminqin
  • 2015年03月17日 15:19
  • 10868

Mysql中的联合索引、前缀索引、覆盖索引

Mysql中的联合索引、前缀索引、覆盖索引索
  • Air_hjj
  • Air_hjj
  • 2017年04月16日 13:09
  • 947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql建立组合索引原则
举报原因:
原因补充:

(最多只允许输入30个字)