mysql建立联合索引_mysql之联合索引

mysql建立联合索引_mysql之联合索引mysql之联合索引测试:前期准备:建立联合索引?CREATETABLE`test`(`id`bigint(16)NOTNULLAUTO_INCREMENT,`aaa`varchar(16)NOTNULL,`bbb`varchar(16)NOTNULL,`ccc`int(11)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEF…

大家好,又见面了,我是你们的朋友全栈君。

mysql之联合索引测试:

前期准备:

建立联合索引?

CREATE TABLE `test` (

`id` bigint(16) NOT NULL AUTO_INCREMENT,

`aaa` varchar(16) NOT NULL,

`bbb` varchar(16) NOT NULL,

`ccc` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

如果表已经建好了,那么修改表:

create index `sindex` on `test` (`aaa`,`bbb`,`ccc`);

这种方式报错

alert table test add INDEX `sindex` (`aaa`,`bbb`,`ccc`)

修改表的存储引擎:

ALTER TABLE tablename ENGINE = MyISAM;

ALTER TABLE tablename ENGINE = INNODB;

Explain:

其中最重要的字段为:id、type、key、rows、Extra

id:

1、id相同:执行顺序由上至下

2、id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

3、id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

type:

访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

key:

查询中如果使用了覆盖索引,则该索引仅出现在key列表中

rows:

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra:

1、Using filesort :

mysql对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说mysql无法利用索引完成的排序操作成为“文件排序”

2、Using temporary:

使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和 group by

3、Using index:

表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高

如果同时出现Using where,表明索引被用来执行索引键值的查找(参考上图)

如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作

覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。

Explain:

下方的控制台主要关注两个栏,type和extra

当extra出现道Using filesort和Using temproary这两个时,表示无法使用索引版,必须尽快做优化。

当type出现all时,表示走的是全表扫描没有走索引,效率低下,这时需要对sql进行调优。

当type出现ref或者index时,表示走的是索引,index是标准不重复的索引,ref表示虽然使用了索引,但是索引列中有重复的值,但是就算有权重复值,也只是在重复值的

范围内小范围扫描,不造成重大的性能影响。

测试语句是否使用了索引:

网上说联合索引 test_col1_col2_col3 实际建立了(col1)、(col1,col2)、(col,col2,col3)三个索引。但是

我蒙蔽了,在我实际的测试中,aaa bbb ccc 这三个条件不管删除那个,怎么组合where条件查询 type:index extral:Using where; Using index 难道说都用到索引了嘛?

sql1:explain select * from test where aaa=1 and bbb=1;

用到了索引

sql2:explain select * from test where bbb=1 and aaa=1;

联合索引设置

aaa bbb

bbb aaa

bbb

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136251.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《算法图解》-9动态规划 背包问题,行程最优化

    《算法图解》-9动态规划 背包问题,行程最优化本文属于《算法图解》系列。学习动态规划,这是一种解决棘手问题的方法,它将问题分成小问题,并先着手解决这些小问题。一背包问题背包问题,在可装物品有限的前提下,尽量装价值最大的物品,如果物品数量足够大,简单的暴力穷举法是不可行的O(2ⁿ),前一章介绍了《贪婪算法》就是解决如何找到近似解,这接近最优解,但可能不是最优解。如何找到最优解呢?就是动态规划算法。动态规划先解决子问题,…

    2022年7月26日
    13
  • 9 python 匹配开头和结尾

    9 python 匹配开头和结尾1.匹配开头和结尾代码 功能^ 匹配字符串开头$ 匹配字符串结尾示例1:^需求:匹配以数字开头的数据importre#匹配以数字开头的数据match_obj=re.match(“^\d.*”,”3hello”)ifmatch_obj:#获取匹配结果print(match_obj.group())else:print(“匹配失败”)运行结果:3hello示例2:$需求:匹配以数字结尾的数据importre#匹配以数字结尾的

    2022年7月25日
    18
  • 大数据采集技术概述

    大数据采集技术概述大数据采集是指从传感器和智能设备、企业在线系统、企业离线系统、社交网络和互联网平台等获取数据的过程。数据包括RFID数据、传感器数据、用户行为数据、社交网络交互数据及移动互联网数据等各种类型的结构化、半结构化及非结构化的海量数据。不但数据源的种类多,数据的类型繁杂,数据量大,并且产生的速度快,传统的数据采集方法完全无法胜任。所以,大数据采集技术面临着许多技术挑战,一方面需要保证数据…

    2022年6月24日
    27
  • 关于sstream的灵活使用

    关于sstream的灵活使用问题有10000个队伍参加。经过工作人员认真负责的统计,本来已经统计好了这一万个队伍的分数和排名,并按照排名从高到低依次进行了编号(从1到10000)但是由于一个非常偶然的因素,导致其中三个编号的数据丢失,而且剩余编号的顺序也全被打乱了。你需要编写一个程序,根据还保留的统计数据,来判断哪些编号的数据丢失了,并将这些编号按照从小到大的顺序重新拼接为一个新数字,然后计算这个新数字除以11的余数。如…

    2022年6月3日
    34
  • 语义分割最新指南2019版「建议收藏」

    语义分割最新指南2019版「建议收藏」之前出现的深度学习语义分割指南2017版(A2017GuidetoSemanticSegmentationwithDeepLearning),作者总结了当年各个具有代表性的语义分割算法与相关贡献。今年NamespaceAfrica数据科学家DerrickMwiti对该领域的再一次梳理(原文链接),希望对大家有帮助。语义分割指的是将图像中的每一个像素关联到一个类别标签上…

    2022年8月21日
    7
  • BigDecimal.setScale()方法实用技巧

    BigDecimal.setScale()方法实用技巧方法使用scale()方法用于格式化小数点setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3setScale(1,BigDecimal.ROUND_UP)进位处理(无论小数如何),2.35变成2.4setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4(目前最常用的金额处理方法…

    2022年10月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号