mysql创建索引

mysql如何避免回表查询

為{幸葍}努か 提交于 2020-02-06 15:18:38
《 迅猛定位低效SQL? 》留了一个尾巴: select id,name where name='shenjian' select id,name ,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什么是回表查询? 什么是索引覆盖? 如何实现索引覆盖? 哪些场景,可以利用索引覆盖来优化SQL? 这些,这是今天要分享的内容。 画外音:本文试验基于MySQL5.6-InnoDB。 一、什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通索引有什么差异? InnoDB 聚集索引 的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引: (1)如果表定义了PK,则PK就是聚集索引; (2)如果表没有定义PK,则第一个not NULL unique列是聚集索引; (3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引; 画外音:所以PK查询非常快,直接定位行记录。 InnoDB 普通索引 的叶子节点存储主键值。 画外音:注意,不是存储行记录头指针,MyISAM的索引叶子节点存储记录指针。 举个栗子,不妨设有表: t(id PK, name KEY, sex, flag); 画外音

mysql——B+树索引

不打扰是莪最后的温柔 提交于 2020-02-06 08:27:50
文章目录 mysql——B+树索引 何谓索引 索引类型 聚簇索引 非聚簇索引 创建索引 创建语句 创建原则 索引覆盖 最左前缀原则 索引失效 不使用索引 参考资料 mysql——B+树索引 何谓索引 索引是一种高效的数据结构,可以帮助数据库快速搜索数据,给某个字段建立索引,就会生成一棵以该字段排序的B+树,如果你不懂B+树,可以想一想为什么排序后二分查找会这么快。索引也不可以过度使用,否则会消耗很多磁盘空间,并且DML操作的时候维护索引也会很消耗性能。 索引类型 聚簇索引 聚簇索引又叫聚集索引或主键索引 聚簇索引有以下两个特点: 特点1: 按主键值的大小进行记录和页的排序,数据页(叶子节点)之间是按照主键值从小到大排序的一个双向链表 特点2: B+树的叶子节点存储的是完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列) InnoDB存储引擎会自动的为我们主键创建聚簇索引,因此只有在搜索添加是主键才能发挥作用 非聚簇索引 别名非聚集索引,二级索引,复制索引,辅助索引。 非聚簇索引按照指定的索引列排序生成B+树,并且叶子节点只存储了索引列的值和主键值,这肯定是为了节省磁盘空间,这使得我们非聚集索引查询时候只能查到主键值,如果你需要记录中除了索引列的其他列的数据,只能通过查到的主键再走一遍聚集索引,这叫做 回表 非聚簇索引又有 唯一索引,联合索引,前缀索引 唯一索引

mysql(2)

爷,独闯天下 提交于 2020-02-05 21:27:11
1、DQL查询数据 1.1、DQL (Data Query LANGUAGE : 数据查询语言) 所有的查询操作都用它 Select 简单的查询,复杂的查询它都能做~ 数据库中最核心的语言,最重要的语句 使用频率最高的语句 1.2、指定查询字段 SELECT * FROM student SELECT * FROM result -- 查询指定字段 SELECT ` studentNo ` , ` studentname ` FROM student -- 别名 给结果起一个名字 SELECT ` studentNo ` AS 学号 , ` studentname ` AS 姓名 FROM student -- 函数 Concat(a,b) SELECT CONCAT ( '姓名:' , studentname ) AS 新名字 FROM student 语法: SELECT 字段,... FROM 表 去重 作用:去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条 -- 去重 SELECT * FROM result SELECT ` studentno ` FROM student SELECT DISTINCT ` studentno ` FROM student 数据库的列 SELECT VERSION ( ) -- 查询系统版本 SELECT 90 - 2

MySql(3)

走远了吗. 提交于 2020-02-05 19:29:49
索引 理解索引 前缀索引 索引关键字是表中关键字值的一部分 可以是字段值的组合 不可以跨表创建索引 主索引与聚簇索引 将主关键字作为索引。在 MyISAM 中,索引关键字的顺序与表中关键字的顺序不必完全相同,称为 主索引 。在 InnoDB 中,两者顺序必须完全相同,这种索引称为 聚簇索引 索引关键字的选取原则 离散度高 存储空间小 存储空间固定 where 子句经常使用 更新不频繁 最左前缀原则 e . g . 使用有firstname , lastname , address组成的复合索引 ( fname_lname_add ) 就不需要再使用 ( firstname ) , ( firstname , lastname ) , ( firstname , lastname , address ) 前缀索引 索引与约束 对于一个表而言,主键约束(主索引/聚簇索引),唯一性约束(唯一性索引),外键约束(普通索引)是基于索引实现的 创建索引 Mysql还支持全文索引(fulltext),当检索数据量大的字符串信息时,可以使用全文索引。 创建表的同时创建索引 create table table_name ( 字段 1 数据类型 [ 约束条件 ] . 字段 2 数据类型 [ 约束条件 ] . …… [ 其他约束条件 ] , [ 其他约束条件 ] , [ unique |

数据库——百万级数据库优化方案

时光总嘲笑我的痴心妄想 提交于 2020-02-05 14:27:12
** 百万级数据库优化方案 ** 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库. 备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。 不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num = 0 3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num = 10 or Name = 'admin' 可以这样查询:

Mysql 索引

好久不见. 提交于 2020-02-05 02:07:38
一. 存储引擎 1. 什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能,而存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。简而言之,就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 2. 存储引擎种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用 Memory 内存存储引擎

mysql 其他基本操作

雨燕双飞 提交于 2020-02-04 19:19:46
介绍数据库的其他基本操作:索引、视图,导入和导出,备份和恢复等。 1.索引 索引是一种与表有关的结构,它的作用相当于 书的目录 ,可以根据目录中的页码快速找到所需的内容。 当表中有大量记录时,若要对表进行查询,没有索引的情况是全表搜索:将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录。这样做会消耗大量数据库系统时间,并造成大量磁盘 I/O 操作。 而如果在表中已建立索引,在索引中找到符合查询条件的索引值,通过索引值就可以快速找到表中的数据,可以大大 加快查询速度 。 ALTER TABLE 表名字 ADD INDEX 索引名 (列名); CREATE INDEX 索引名 ON 表名字 (列名); ex: //在employee表的id列上建立名为idx_id的索引ALTER TABLE employee ADD INDEX idx_id (id); //在employee表的name列上建立名为idx_name的索引CREATE INDEX idx_name ON employee (name); 查看索引 SHOW INDEX FROM 表名字; 2.视图 视图是从一个或多个表中导出来的表,是一种 虚拟存在的表 。它就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。 注意理解视图是虚拟的表:

MySQL---索引

感情迁移 提交于 2020-02-04 14:45:09
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 0.5s 0.00001s 提取句子主干,就可以得到索引的本质: 索引是数据结构。 1.索引的分类 在一个表中,主键索引只能有一个,唯一索引可以有多个 主键索引 (PRIMARY KEY ) 唯一的标识,主键不可重复,只能有一个列作为主键 唯一索引 (UNIQUE KEY) 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引 常规索引 (KEY/INDEX) 默认的, index。key 关键字来设置 全文索引 (FullText) 在特定的数据库引擎下才有,MyISAM 快速定位数据 -- 索引的使用 -- 1、在创建表的时候给字段增加索引 -- 2、创建完毕后,增加索引 -- 显示所有的索引信息 SHOW INDEX FROM student -- 增加一个全文索引 (索引名) 列名 ALTER TABLE school . student ADD FULLTEXT INDEX ` studentName ` ( ` studentName ` ) ; -- EXPLAIN 分析sql执行的状况 EXPLAIN SELECT * FROM student ; -- 非全文索引 EXPLAIN SELECT * FROM student WHERE MATCH (

我的MYSQL学习心得(九)

血红的双手。 提交于 2020-02-04 03:12:37
原文: 我的MYSQL学习心得(九) 我的MYSQL学习心得(九) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 我的MYSQL学习心得(八) 这一篇《我的MYSQL学习心得(九)》将会讲解MYSQL的索引 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。 根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。 大多数存储引擎有更高的限制。MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关; MYISAM和InnoDB存储引擎只支持BTREE索引;MEMORY和HEAP存储引擎可以支持HASH和BTREE索引 索引的优点: 1、通过创建唯一索引,保证数据库表每行数据的唯一性 2、大大加快数据查询速度 3、在使用分组和排序进行数据查询时,可以显著减少查询中分组和排序的时间 索引的缺点: 1、维护索引需要耗费数据库资源 2、索引需要占用磁盘空间,索引文件可能比数据文件更快达到最大文件尺寸 3、当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响 索引的分类 1

2.索引优化分析

試著忘記壹切 提交于 2020-02-02 15:59:08
性能下降SQL慢 、执行时间长 、 等待时间长 常见原因: 1.查询语句写的烂 2.索引失效 #id name email weixinNumber select *from user where name=""; select *from user where name="" and email=""; create index idx_user_name on user(name);#单值 create index idx_user_nameEmail on user(name,email);#复合 2.关联查询太多join(设计缺陷或不得已的需求) 3.服务器调优及各个参数设置(缓冲\线程数等) sql 执行顺序 #手写sql的顺序 7 select 8 distinct <select_list> 1 from <left_table> 3 <join_type> join <right_table> 2 on <join_condition> 4 where <where_condition> 5 group by <groupby_list> 6 having <having_condition> 9 order by <orderby_conditoin> 10 limit <limit number>; #机读 1. FROM <left_table> 2. ON