mysql索引的艺术 单列索引与多列索引的区别

CREATE TABLE `security_role_resource` (
  `id` varchar(50) NOT NULL DEFAULT ‘‘,
  `role_id` varchar(50) DEFAULT NULL,
  `resource_id` varchar(50) DEFAULT NULL,
  `date_create` timestamp NULL DEFAULT NULL,
  `date_update` timestamp NULL DEFAULT NULL,
  `date_delete` timestamp NULL DEFAULT NULL,
  `parent_shop_code` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_role_id` (`role_id`),
  KEY `index_resource_id` (`resource_id`),
  KEY `index_parent_shop_code` (`parent_shop_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `security_role_resource2` (
  `id` varchar(50) NOT NULL DEFAULT ‘‘,
  `role_id` varchar(50) DEFAULT NULL,
  `resource_id` varchar(50) DEFAULT NULL,
  `date_create` timestamp NULL DEFAULT NULL,
  `date_update` timestamp NULL DEFAULT NULL,
  `date_delete` timestamp NULL DEFAULT NULL,
  `parent_shop_code` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_parent_shop_code_role_id_resource_id` (`parent_shop_code`,`role_id`,`resource_id`),
  KEY `index_role_id` (`role_id`),
  KEY `index_resource_id` (`resource_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

两个表的区别在于第二表是组合索引,组合了`parent_shop_code`,`role_id`,`resource_id`三列

单独的每个有索引的列查询没有区别,但是如果多个条件一起查询

explain select * from security_role_resource2 where parent_shop_code=‘002142‘ and resource_id=‘PNqiYZbiNN‘ and role_id=‘GBcvY87pCq‘ ;

mysql的处理方式不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外几个索引利用不上了,这样效果就不如多列索引了。

现在同样的查询条件对第一个表查询

explain select * from security_role_resource where parent_shop_code=‘002142‘ and resource_id=‘PNqiYZbiNN‘ and role_id=‘GBcvY87pCq‘ ;

下面这样的查询用不到组合索引:

explain select * from security_role_resource where parent_shop_code=‘002142‘ or role_id=‘GBcvY87pCq‘;

时间: 2024-11-16 02:17:41

mysql索引的艺术 单列索引与多列索引的区别的相关文章

数据库索引- 多列索引

对复合索引,按照字段在查询条件中出现的频度建立索引.在复合索引中,记录首先按照第一个字段排序.对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推.因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用. 二.多列索引适合的场景 1.全字段匹配 2.匹配部分最左前缀 3.匹配第一列 4.匹配第一列范围查询(可用用like a%,但不能使用like %b) 5.精确匹配某一列

mysql 什么时候用单列索引?什么使用用联合索引?

我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在nage和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢? 作者:范孝鹏链接:https://www.zhihu.com/question/40736083/answer/88191544来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1,首先要确定优化的目标,在什么样的业务场

MySQL使用单列索引和多列索引

讨论MySQL选择索引时单列单列索引和多列索引使用,以及多列索引的最左前缀原则. 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一.可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列.请看下面这个查询: Select age -- 不使用索引 FROM people Where firstname='Mike' -- 考虑使用索引 AND lastname='Sullivan' -- 考虑使用索引 这个查询属于简单查询.由于age

MYSQL 什么时候用单列索引?什么使用用联合索引?(收集)

我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢? 1,首先要确定优化的目标,在什么样的业务场景下,表的大小等等.如果表比较小的话,可能都不需要加索引. 2,哪些字段可以建索引,一般都where.order by 或者 group by 后面的字段. 3,记录修改的时候需要维护索引,所以会有开销,要衡

mysql索引 多个单列索引和联合索引的区别详解

背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引测试注:Mysql版本为 5.7.20 创建测试表(表记录数为63188): CREATE TABLE `t_mobilesms_11` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `userId` varchar(255) CHARACTER SET utf

MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表 代码如下: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  ); 我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找use

mysql 多列索引优化

Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字节.在索引中使用col_name(length)语法,可以创建一个只使用char和archar列的第一个length个字符的索引,按这种方式只索引列的前缀可以索引文件小的多.MyISAm和INNODb存储引擎还支持对blob和text列的索引,但是必须指定索引长度.fulltext索引用于全文搜索不

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,lastname,age).(firstname,lastname)以及(firstname)这些列组合上的索引.2 2. 一条 sql 可以使用多个索引2 2.1. 什么是索引合并2 2.2. 使用索引合并有啥收益3 2.3. 具体的索引合并流程 4 3. Referred.4 1. MySQL只能使用一

MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`column`)INDEX(普通索引)      ALTER TABLE `table_name` ADD INDEX index_name ( `column