MySQL索引

数据库索引的本质是数据结构,这种数据结构能够帮助我们快速的获取数据库中的数据。


索引类型

  • 唯一索引
    看见名字我们就知道,唯一索引列中的值必须是唯一的。不过有一个例外,可以有且可以有多个Null。
  • 普通索引
    普通索引可以包括不止一列,一般把多个列组成的普通索引叫组合索引,也有把普通索引看成是只有一列的组合索引的。此外,在索引字符串时,可以只把前几位作为索引来提升效率。因为最左前缀,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
  • 主键
    主键必须唯一,不同的是不能有Null。而且一个表只能有一个主键。有很多人认为主键是唯一索引的一种,其实是不准确的。主键也可以是组合索引,只要组合的每条结果是唯一的。

注:
1.指定了AUTO_INCREMENT的列必须要建索引,不然会报错,主键,唯一键也是索引的一种不需要另外指定了。
2.mysql中执行查询时,对一张表只能使用一个索引,如果我们在例如lname,fname,age上分别单独建立索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引(所以这里使用组合索引效率更高)。


creators表

在NAME加上索引

mysql> select * from creators where NAME = 'ABC';
mysql> alter table creators add index NAME (NAME);
mysql> select * from creators where NAME = 'ABC';
mysql> SHOW PROFILES;

设置索引

ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)

删除索引

DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
第3条语句只在删除PRIMARY KEY索引时使用,如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

查看索引

mysql> show index from tblname;
mysql> show keys from tblname;

索引原则
最左前缀匹配原则

mysql> alter table creators add index cd_n_pn (CREATOR_DATE, NAME, PROFLIE_NAME);
mysql> select * from creators where CREATE_DATE = '2046-09-01' and NAME = 'ABC' and PROFLIE_NAME = 'DEF';
mysql> select * from creators where CREATE_DATE = '2046-09-01' and NAME = 'ABC';
mysql> select * from creators where CREATE_DATE = '2046-09-01' and PROFLIE_NAME = 'DEF';
mysql> select * from creators where NAME = 'ABC' and PROFLIE_NAME = 'DEF';

前三个查询会用到索引,最后一个查询因为没用到组合索引的最左列,所以不会用到索引而是遍历了所有的数据,这就是最左前缀匹配。
最左前缀匹配原则,是非常重要的原则,mysql会一直向右匹配(拿索引从左往右去匹配条件)直到遇到范围查询(>、<、between、like)就停止匹配,但第一个范围索引本身是可以使用索引的,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
再举一个例子:
假设你在表的state、city和zip数据列上建立了复合索引。索引中的数据行按照state/city/zip次序排列。这意味着,即使你在查询中只指定了state值,
或者指定state和city值,MySQL也可以使用这个索引。因此,这个索引可以被用于搜索如下所示的数据列组合:state, city, zip或state, city或state。MySQL不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果你按照city或zip或city,zip来搜索,就不会使用到这个索引。如果你搜索给定的state和zip(索引的1和3列),该索引也是不能用于这种组合值的,只会利用索引来查找匹配的state从而缩小搜索的范围。所以根据最左前缀原则,这个组合索引相当于创建了(state)单列索引,(state, city)组合索引以及(state, city, zip)组合索引。

选择区分度高的列作为索引
区分度:count(distinct col)/count(*),,表示字段不重复的比例,越接近1区分度越高,唯一键或主键的区分度就是1。

索引列不能参与计算
保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引。

尽量的扩展索引,不要新建索引
比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

如何确定一个查询有没有走索引
MySQL中自带命令行工具 explain 来查看一个sql语句是否了索引
使用方式:

  explain select * from tb_test;

关注的项:

  • type : 查询access的方式,表的连接类型
    index : 索引
    full : 全表扫描
    ref : 参照查询,也就是等值查询
    range : 范围查询
  • key : 本次查询最终选择使用哪个索引,NULL为未使用索引
  • key_len : 选择的索引使用的前缀长度或者整个长度
  • rows : 查询逻辑扫描过的记录行数
  • extra : 额外信息,主要是指fetch data的具体方式

要点:
1.唯一索引:唯一索引列中的值必须是唯一的,但可以有多个Null。主键(没有Null),唯一键也是唯一索引的一种不需要另外指定了。
普通索引:普通索引可以包括不止一列,一般把多个列组成的普通索引叫组合索引。
2.AUTO_INCREMENT:对于innodb,指定了AUTO_INCREMENT的非主键列必须要在建表时显式建立索引,如果是组合索引,必须是组合索引的第一列,不然会报错。主键,唯一键也是索引的一种不需要另外指定了。且一个表只能有一个AUTO_INCREMENT属性。
3.添加索引:ALTER TABLE table_name ADD INDEX index_name (column_list)。
删除索引:DROP INDEX index_name ON talbe_name 或 ALTER TABLE table_name DROP INDEX index_name。
查看索引:show index from tblname。
4.最左前缀匹配原则:在查询中必须有索引最左列才会使用到这个索引,(拿索引从左往右去匹配条件,直到遇到范围查询 >、<、between、like 就停止匹配,但它本身可以使用索引。)所以如果都是=,则查询条件的顺序是可以变的。
5.用mysql自带的命令行工具 explain 来查看一个sql语句是否了索引,例如:explain select * from tb_test;


参考:http://www.kuqin.com/shuoit/20161129/353112.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容