《MySQL——索引笔记》

目录

    • 回表
    • 覆盖索引
    • 最左前缀原则
    • 联合索引的时候,如何安排索引内的字段顺序?
    • 索引下推
    • 重建索引问题
    • 联合主键索引和 InnoDB 索引组织表问题
    • in与between的区别

回表

回到主键索引树搜索的过程,我们称为回表。

覆盖索引

覆盖索引就是在这次的查询中,所要的数据已经在这棵索引树的叶子结点上了。

select ID from T where k between 3 and 5

在这里插入图片描述
ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表.
由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

覆盖索引的第二个使用:在联合索引上使用,也可以避免回表。
如果现在有一个高频请求,要根据市民的身份证号查询他的姓名。我们可以建立一个(身份证号、姓名)的联合索引。它可以在这个高频请求上用到覆盖索引,不再需要回表查整行记录,减少语句的执行时间。

最左前缀原则

联合索引先根据第一个字段排序,如果第一个字段有相同的,就按照第二个字段排序。
在这里插入图片描述
只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

联合索引的时候,如何安排索引内的字段顺序?

第一原则:
如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
如果我们有个频繁的要求:根据姓名找到该人身份证,那么应该建立联合索引:(name,ID)
反之,如果我们有个频繁的要求:根据该人身份证找到该人姓名,那么应该建立联合索引:(ID,name)

索引下推

索引覆盖是你要查的信息在二级索引中已经有了,就不需要回表。索引下推是你的过滤条件有一部分符合了最左前缀,那么会用上索引,如果此时不符合最左前缀的部分刚好有联合索引中的字段,那么在利用最左前缀进行索引查询的同时,会根据这些字段多做一步过滤,减少索引查询出来的条数,这样就减少了回表次数。
如:


mysql> select * from tuser where name like '张%' and age=10 and ismale=1;
1 每次都需要回表
2 下推,先滤除不符合的,再回表

重建索引问题

假设,我们有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引。

mysql> create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;

如果你要重建索引 k:

alter table T drop index k;
alter table T add index(k);

如果你要重建主键索引:

alter table T drop primary key;
alter table T add primary key(id);

上面这两个重建索引的作法对此有什么理解?
为什么要重建索引?
索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。
理解
不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。
推荐使用:

alter table T engine=InnoDB

联合主键索引和 InnoDB 索引组织表问题

有这么一个表:


CREATE TABLE `geek` (`a` int(11) NOT NULL,`b` int(11) NOT NULL,`c` int(11) NOT NULL,`d` int(11) NOT NULL,PRIMARY KEY (`a`,`b`),KEY `c` (`c`),KEY `ca` (`c`,`a`),KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

既然主键包含了 a、b 这两个字段,那意味着单独在字段 c 上创建一个索引,就已经包含了三个字段了呀,为什么要创建“ca”“cb”这两个索引?同事告诉他,是因为他们的业务里面有这样的两种语句:


select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

为了这两个查询模式,这两个索引是否都是必须的?为什么呢?
表记录:
主键 a,b 的聚簇索引组织顺序相当于 order by a,b ,也就是先按 a 排序,再按 b 排序,c 无序。

abcd
123d
132d
143d
213d
222d
234d

索引 ca 的组织是先按 c 排序,再按 a 排序,同时记录主键:
这个跟索引 c 的数据是一模一样的。

cab
213
222
312
314
321
423

索引 cb 的组织是先按 c 排序,再按 b 排序,同时记录主键:

cba
222
231
312
321
341
432

所以,结论是 ca 可以去掉,cb 需要保留。

in与between的区别

--1.
select * from T where k in(1,2,3,4,5)
--2.
select * from T where k between 1 and 5

1.in 内部的数字是未知的,不知道是否有序,是否连续等,所以你只能一个一个去看。
2.一个已知的升序、范围查询,只需定位第一个值,后面遍历就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《操作系统知识点整理》

目录进程与线程比较多线程同步与互斥生产者与消费者哲学家就餐问题读者写者问题进程间通信管道消息队列共享内存信号量信号Socket锁互斥锁与自旋锁读写锁乐观锁与悲观锁死锁进程与线程比较 进程是资源(包括内存、打开的文件等)分配的单位,线…

操作系统大内核和微内核_操作系统中的内核

操作系统大内核和微内核A Kernel is the central component of an Operating System. The Kernel is also said to be the heart of the Operating System. It is responsible for managing all the processes, memory, files, etc. The Kernel functions at the lowest level …

《MySQL——锁》

全局锁是什么?全局锁有什么用?全局锁怎么用? 全局锁主要用在逻辑备份过程中,对于InnoDB 引擎的库,使用–single-transaction; MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTW…

搜索引擎Constellio及Google Search Appliances connectors

做搜索产品的时候发现国外一个同类型的产品contellio,发现功能比较强大,先记录下来 貌似可以添加文档 网站 以及数据库等不同类型的数据源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读

原地址:http://blog.csdn.net/delltdk/article/details/9186875 在进入detectMultiScal函数之前,首先需要对CascadeClassifier做初始化。 1. 初始化——read函数 CascadeClassifier的初始化很简单: cv::CascadeClassifier classifier; cl…

abs std::abs_ABS的完整形式是什么?

abs std::absABS:防抱死制动系统 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

汉字速查使用方法简介

《汉字速查》(HanziSearcher)是一个支持全汉字字典和词典的检索工具。其界面如下所示。 界面上方为工具栏。 左方为字典和词典检索栏。 右方在启动时显示版权信息和作者的联系方式,在执行检索时,显示检索结果。 检索方法 汉字速查…

android jni示例_Android服务示例

android jni示例A service is a component that runs in the background for supporting different types of operations that are long running. The user is not interacted with these. These perform task even if application is destroyed. Examples include handling of…

空间换时间,把递归的时间复杂度降低到O(2n)

递归算法的时间复杂度除非只有前两项,否则都不是线性的,并且相当耗费内存。我们用最常见的的fibonacci数列来说明: function fibonacci(n){if( n 0 || n 1){return n;} else {return fibonacci(n - 1) fibonacci(n - 2);} } 这是一种最常见…

《MySQL——给长字符串加索引》

对于长字符串,可用如下方式建立索引: (1)前缀索引 (2)字符串倒叙前缀索引 (3)添加hash字段并在hash字段上加索引 (4)字段拆分(一个字段可拆分为两…

傻瓜教你看清MVC内部执行流程之ViewData数据传输,轻松学MVC--①目了然篇(待续)

1.首先在执行到Controller里面的action(方法)时,执行到最后会调用一个View()-->此方法是Controller的一个方法 源代码: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后继续调用自己…

poj 1088

题目:http://poj.org/problem?id1088 记忆化搜索,dp[r][c] max(dp[r - 1][c] , dp[r 1][c] , dp[r][c - 1] , dp[r][c 1]) 1 ( if (题目给的条件满足)) View Code 1 using namespace std;2 typedef long long ll;3 const in…

《MySQL——order by逻辑(全字段排序与rowid排序)》

创建一个表,然后使用查询语句: 查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄 create table t (id int(11) not null,city vachar(16) not null,name vachar(16) not null,age vachar(16) not null,addr va…

HTML5 video

摘要:本文主要介绍HTML5 video在android2.2中实现的主要架构和程序流程。 一、实现HTML5 video主要的类 1. 主要类结构及介绍 图1中绿色类为java类,其余为c类,下面是各个类的具体介绍: (1) HTMLElement类不是最上层类&#xff0c…

明源面试

明源面试,笔试题目如下 一、SQL测试题 1 有两张表 根据给出的SQL语句,写出返回的行数分别是多少?为了形象直观的显示,我给出了sql语句执行结果。 A 学生表 B分数表 新题目 select a.* from a inner join b on a.idb.id; …

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基:肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态,函数的参数类型可以不确定吗? 函数的返回值只能是一个吗?函数的返回值可以不确定吗? 泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR:Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…

《MySQL——查询长时间不返回的三种原因与查询慢的原因》

目录查询长时间不返回等MDL锁等flush等行锁查询慢构造一张表,表有两个字段id和c,再里面插入了10万行记录 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

《MySQL——幻读与next-key lock与间隙锁带来的死锁》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);该表除了主键id,还有索引c。 问下面的语句…