索引

不走索引的几种情况

眉间皱痕 提交于 2020-02-02 17:29:25
1、查询谓词没有使用索引的主要边界,换句话说就是SELECT *可能会导致不走索引。 比如:SELECT * FROM T1 WHERE C1 = ‘XXX’;假如你的T1表上有一个包含C1值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成SELECT C1 FROM T1 WHERE C1 = ‘XXX’;优化器会直接去索引中找到C1的值,因为从B树中就可以找到相应的值。 2、单键值的B树索引列上存在null值,导致COUNT( )不能走索引。 比如:在B树索引中有一个空值,那么查询SELECT COUNT( ) FROM T1;的时候,因为HASHSET中不能存储空值,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T1 WHERE XXX IS NOT NULL;或者把这个字段的属性改为not null。 3、索引列上有函数运算,导致不走索引。 比如:SELECT * FROM T1 WHERE EXTRACT(YEAR FROM C1) = ‘XXX’;即使在T1表上有一个索引包含C1字段,这个时候索引也不会被用到,因为你要查询的列中所有的行都要被计算一遍,因此要效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX

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

Mysql 二级索引回表知识点:顺序I/O & 随机I/O

浪尽此生 提交于 2020-02-02 15:27:42
一、准备工作 1.1 创建一张数据表 CREATE TABLE ` student ` ( ` id ` bigint ( 20 ) NOT NULL COMMENT 'ID' , ` name ` varchar ( 64 ) DEFAULT NULL COMMENT '姓名' , ` age ` int ( 3 ) DEFAULT NULL COMMENT '年龄' , ` birth ` timestamp NULL DEFAULT NULL COMMENT '出生日期' , PRIMARY KEY ( ` id ` ) , KEY ` idx_name ` ( ` name ` ) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ; 在创建 student 表的同时创建了二级索引 idx_name ( name ) 1.2 准备测试数据 创建三条二级索引回表测试数据 二、顺序I/O & 随机I/O 执行 SQL 语句如下: select * from student where name > '马百万' and name < '马百万3' 毫无疑问,展示出的记录是为 name = 马百万2 的记录。但是在查询的这个过程中存储数据底层发生了 顺序I/O & 随机I/O 两步操作 三、总结 name

MySQL索引 - 索引的类型

橙三吉。 提交于 2020-02-02 12:15:08
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是 按顺序存储 的,并且每一个叶子页到根的距离相同。 B-Tree 索引 能够 加快访问数据的速度 ,存储引擎 不再需要进行全表扫描 来获取需要的数据,取而代之的是 从索引的根节点开始搜索 。 B-Tree 索引 适用于全键值、键值范围或键前缀查找( 最左前缀原则 )。 哈希索引 哈希索引 基于哈希表实现,只有 精确匹配索引 所有列的查询才有效。 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。 哈希索引 自身 只需存储对应的哈希值和行指针 ,而 不存储字段值 ,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 哈希索引 数据并不是按照索引值顺序存储的,所以 无法用于排序 。 哈希索引 不支持部分索引列匹配查找 ,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。 哈希索引 不支持任何范围查询 ,如WHERE score > 60。 哈希索引 只支持等值比较查询 ,包括=、IN()、<=>(注意<>和<=>是不同的操作)。 介绍一个 使用场景 :如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。 创建表 1

MySQL数据库索引——(八)

半世苍凉 提交于 2020-02-02 11:22:30
MySQL数据库索引——(八) 9.1数据库索引 MySQL官方对索引定义为: 索引(index)是帮助MySQL高效获取数据的数据结构 ,提取句子主干,就可以得到索引的本质:索引是数据结构。 9.2索引的分类 主键索引 (Primary Key) 唯一索引 (Unique) 常规索引 (KEY/Index) 全文索引 (FullText) I.主键索引 (Primary Key) 作用:一张表中能唯一标识一条记录的一个列 特点: 唯一的标识,不可重复,只能有一个列作为主键 能够确保数据记录的唯一性 能记录数据在数据库中的位置 ii.唯一索引 (Unique) 作用:避免同一张表重复的列出现,唯一索引可以重复,多个列都可以有标识位(唯一索引) iii.常规索引 (KEY/Index) 作用:快速定位需要拿到的数据(默认的) IV.全文索引 (FullText) 作用:快速定位数据 注意:在特定的数据库引擎下才有,例如MySAM类型的数据表,且只能用于CHAR , VARCHAR , TEXT数据列类型,适用于大型数据集 9.4索引的使用 ! [ explain2 ] ( F:\图片库\explain2 . PNG ) ! [ explain2 ] ( F:\图片库\explain2 . PNG ) -- 索引的使用 -- 1.在创建表的时候给字段增加suoyin CREATE

MySQL

a 夏天 提交于 2020-02-02 09:30:47
一、索引 B+ Tree 原理 MySQL 索引 索引优化 索引的优点 索引的使用条件 二、查询性能优化 使用 Explain 进行分析 优化数据访问 重构查询方式 三、存储引擎 InnoDB MyISAM 比较 四、数据类型 整型 浮点数 字符串 时间和日期 五、切分 水平切分 垂直切分 Sharding 策略 Sharding 存在的问题 六、复制 主从复制 读写分离 参考资料 一、索引 B+ Tree 原理 1. 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。 在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 key i 和 key i+1 ,且不为 null,则该指针指向节点的所有 key 大于等于 key i 且小于等于 key i+1 。 2. 操作 进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data。 插入删除操作会破坏平衡树的平衡性,因此在插入删除操作之后

聚集索引,非聚集索引

那年仲夏 提交于 2020-02-02 08:18:14
概括: 这里说的聚集索引是聚簇索引 聚簇索引即建立在聚簇上的索引,创建聚簇索引时,需要对已有表数据重新进行排序(若表中已有数据),即删除原始的表数据后再将排序结果按物理顺序插回,故聚簇索引建立完毕后,建立聚簇索引的列中的数据已经全部按序排列。 一个表中只能包含一个聚簇索引,但该索引可以包含多个列。 B-树索引中,聚簇索引的叶层就是数据页。 非聚簇索引类似书本索引,索引与数据存放在不同的物理区域,建立非聚簇索引时数据本身不进行排序。一个表中科含多个非聚簇索引。 B-树索引中,非聚簇索引的叶层仍是索引页,其以指针指向数据页实际存储位置。 详解,列子: 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储。 非聚集索引的叶层是由索引页而不是由数据页组成。 非聚集索引既可以建在堆表结构上也可以建在聚集索引表上;非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。 如果表是堆则行定位器是指向行的指针。该指针由文件标识符 (ID) 、页码和页上的行数生成。整个指针称为行 ID (RID) 。 如果表包含有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引, SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见

聚集索引与非聚集索引

这一生的挚爱 提交于 2020-02-02 07:49:22
非聚集索引也是堆结构?其实 SQLSERVER 有几种页面类型(数据都使用一页一页来存储,就像 Windows 的内存也是使用页面来组织的)感兴趣的朋友可以了解下,希望本文可以增加你们对非聚集索引结构的理解。 我们知道 SQLSERVER 的数据行的存储有两种数据结构: A :堆 B : B 树( binary 二叉树)。数据按照这种两种的其中一种来排序和存储,学过数据结构的朋友应该知道二叉树,为什麽用二叉树,因为方便用二分查找法来快速找到数据。堆的数据是不按照任何顺序排序的,也没有任何结构,数据页面也不是首尾相连的。不像 B 树,数据页面使用双向链表首尾相连。堆表只依靠表里的 IAM 页(索引分配映射页)将堆的页面联系在一起, IAM 里记录了页面编号,页面位置除非表里有聚集索引,如果没有的话那么表里的数据的存储就是堆结构。 那么非聚集索引呢 ? 非聚集索引也是堆结构?其实 SQLSERVER 有几种页面类型(数据都使用一页一页来存储,就像 Windows 的内存也是使用页面来组织的) 其中有一种是索引页,一种是数据页。 我感觉很多书都说不清,就像我一样,在文章的开头也是这样说的:数据行的存储有两种数据结构: A :堆 B : B 树(二叉树) 我觉得应该是数据页面的存储有两种数据结构: 1 、堆 2 、 B 树 先说一下:索引页,不管是聚集索引还是非聚集索引

聚集索引和非聚集索引的区别

佐手、 提交于 2020-02-02 06:00:22
SQL SERVER提供了两种索引:聚集索引和非聚集索引。其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 聚集索引使用注意事项   • 定义聚集索引键时使用的列越少越好。   • 包含小量非重复值的列。   • 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。   • 被连续访问的列。   • 返回大型结果集的查询。   • 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。   • OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。

聚集索引和非聚集索引的区别

ぐ巨炮叔叔 提交于 2020-02-02 05:06:04
SQL SERVER提供了两种索引:聚集索引和非聚集索引。其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。 方法/步骤 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 聚集索引使用注意事项 定义聚集索引键时使用的列越少越好。 • 包含大量非重复值的列。 .• 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。 • 被连续访问的列。 • 回大型结果集的查询。 • 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。 • OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。 聚集索引不适用于: •