唯一索引

all index range ref eq_ref const system 索引type说明

こ雲淡風輕ζ 提交于 2020-03-28 23:19:57
背景知识 在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型。 索引类型 type 我们可以清楚的看到 type 那一栏有 index ALL eq_ref ,他们都代表什么意思呢? 首先类型有许多,这里我只给大家介绍用的最多的 几种 类型: system>const>eq_ref>ref>range>index>ALL 越往左边,性能越高, 比如 system 就比 ALL 类型性能要高出许多 ,其中 system 、 const 只是理想类型,基本达不到; 我们自己实际能优化到 ref>range 这两个类型,就是你自己写 SQL ,如果你没优化基本上就是 ALL ,如果你优化了,那就尽量达到 ref>range 这两个级别; 左边基本达不到! 所以,要对 type 优化的前提是, 你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是 ALL..... ; Type 级别详解 一 .system 级别 索引类型能是 system 的只有两种情况: 1. 只有一条数据的系统表 只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到; 2. 或衍生表只能有一条数据的主查询 这个是可以实现的,但是在实际开发当中

MySQL4:索引

百般思念 提交于 2020-03-28 04:26:55
什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个 列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有 一个索引,MySQL能快速到达一个位置去搜索数据文件,而不必查看所有数据。 索引的含义和特点 索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 例如,数据库里面有20000条记录,现在要执行这么一个查询:SELECT * FROM table where num = 10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,MySQL不需要任何扫描,直接在 索引中找10000,就可以得知值这一行的位置。可见,索引的建立可以提高数据库的查询速度。 索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种 存储引擎也不一定支持所有索引类型。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的额限制,MySQL中索 引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关

关于唯一索引和普通索引的抉择

爷,独闯天下 提交于 2020-03-26 11:16:10
想象这样一个场景,在设计一张用户表时,每人的身份证号是唯一的,需要搜索。但由于身份证号字段较大,不好将其作为主键。在业务代码已经保证插入身份证唯一的情况下,可以选择建立唯一索引和普通普通索引,这时该如何选择呢?接下来,将从查询和更新的执行过程进行分析。 查询过程 假设 k 是表 t 上的索引,在搜索 select id from t where k=5 时,会先从 k 这棵 B+ 的树根开始,按层搜索叶子节点,找到 k=5 的数据页,然后在数据页内容进行二分法定位。 对于普通索引,找到 k=5 的记录后,会继续向下查找一个,直到碰到第一个不是 5 的记录结束。 对于唯一索引,由于取值唯一,找到后直接停止。 由于 InnoDB 是按照数据页为单位(数据页默认 16 KB)进行读写的,在读取一条数据时, 会将整个数据页整体读到内存。 在读入内存的数据页中,如果包含 k=5 的记录,在查询的情况下,唯一索引比普通索引多了一次查找和判断的过程,可以忽略。 如果 k=5 是当前数据页的最后一条,就需要在读取下一个数据页。但这发生的概率较低,也可以忽略。 所以总得来说,普通索引和唯一索引在查询的过程中差异不大。 change buffer 在分析唯一索引和普通索引的影响前,先来认识一下 change buffer 这个结构。 什么是 change buffer ? 在执行更新操作时

第七章——设计和调整索引

杀马特。学长 韩版系。学妹 提交于 2020-03-18 21:44:41
要定义一个在任何地方都有效的索引策略是不可能的。因为每个系统都是独一无二的,都需要基于工作量的索引方法,业务需求和其他的一些因素。然而,有一些设计方面的考虑和准则,可以适用于每一个系统。 当我们要优化现有系统时,也是这样。而优化是一个迭代过程,每个案例中都是独一无二的,有一系列技术可以用来检测数据库系统每个案例中的低效率的例子。 在本章中,我们将介绍一些重要的因素,在设计新索引和优化现有系统时需要牢记这些因素。 分类索引设计考虑因素 每次更改聚集索引键的值,都会发生两件事。第一件事就是sql服务器在聚集索引页链和数据文件中把行移动到不同位置。第二,它更新聚集索引键的行号。所有非聚集索引都要存储、更新行标识。但就 输入 /输出端口而言,在批量更新的情况下会 特别很贵。而且,在行 id大小增加的情况下,它会增加群集索引和非群集索引的碎片化。因此,最好是有一个静态的聚集索引,因为它关键值不会改变。 所有非聚集索引都使用聚集索引键作为行 id。太宽泛的聚集索引键会增加非聚集索引行的大小,而且需要更多空间来存储它们。结果就是sql服务器在索引或范围扫描操作中需要处理更多的数据页,会索引降低效率。在非唯一非聚集索引的情况下,行id也存储在非叶索引级别,反过来,减少每页索引记录的数量,会导致索引中额外的中间级别。即使非叶索引级别通常缓存在内存中

关于 InnoDB 锁的超全总结

这一生的挚爱 提交于 2020-03-09 02:28:16
共享锁和排他锁,其实就是我们常说的读锁和写锁。它们之间的互斥规则,想必都清楚,就不赘述了。但有一点需要注意,共享锁和排他锁是标准的实现行级别的锁。举例来说,当给 select 语句应用 lock in share mode 或者 for update,或者更新某条记录时,加的都是行级别的锁。 与行级别的共享锁和排他锁类似的,还有表级别的共享锁和排他锁。如 LOCK TABLES ... WRITE/READ 等命令,实现的就是表级锁。 Intention Locks 在 InnoDB 中是支持多粒度的锁共存的,比如表锁和行锁。而 Intention Locks - 意向锁,就是表级锁。和行级锁一样,意向锁分为 intention shared lock (IS) 和 intention exclusive lock (IX) . 但有趣的是,IS 和 IX 之间并不互斥,也就是说可以同时给不同的事务加上 IS 和 IX. 兼容性如下: 这时就产生疑问了,那它俩存在的意义是什么?作用就是,和共享锁和排他锁互斥。注意下,这里指的是表级别的共享锁和排他锁,和行级别没有关系! 官网中给了这样一段解释: The main purpose of intention locks is to show that someone is locking a row, or going to lock

数据库部分 面经集合

大兔子大兔子 提交于 2020-03-08 18:21:18
1、Mysql 主键是什么概念 “主键(PRIMARY KEY)”的完整称呼是“主键约束”。MySQL 主键约束是 一个列或者列的组合 ,其值能 唯一地标识表中的每一行。 这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。 2、主键和索引的关系与区别 主键一定是唯一性索引,唯一性索引并不一定就是主键。 一个表中可以有多个唯一性索引,但只能有一个主键。 主键列不允许空值,而唯一性索引列允许空值。 主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是 主键不实际存在,而索引实际存在数据库中 3、 MyISAM与Innodb MySQL有多种存储引擎,每种存储引擎有各自的优缺点,比较常用的是 MyISAM 与 Innodb: Innodb 支持事务,支持外键;MyISAM 都不支持。 MyISAM 适合查询以及插入为主的应用,其索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。 InnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。 4、辅助索引、聚集索引与非聚集索引 索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,数据库的主流索引结构有 B+ 树以及 Hash 结构,B

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

杀马特。学长 韩版系。学妹 提交于 2020-03-08 10:37:22
mysql数据库,卡系统运行了一段时间,后来卡号要求不可以重复,于是加了一个唯一索引 alter table card add unique(cardnum),结果报错:ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes,我设置的cardnum长度是varchar(256),于是修改该长度,改为varchar(64),alter table card modify column cardnum varchar(64),然后再执行增加唯一索引的语句,问题解决;网上说有要调整mysql的参数的方案,但是用不到,所以没有去使用那种办法。 来源: CSDN 作者: 威武 白 链接: https://blog.csdn.net/JamesBaiLove/article/details/104445126

主键索引和唯一索引的区别

北战南征 提交于 2020-03-06 10:29:50
-- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + 唯一索引了。 主键可以被其他表引用为外键,而唯一索引不能。 一个表最多只能创建一个主键,但可以创建多个唯一索引。 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。 -- 创建一张仅包含主键和唯一索引的表 CREATE TABLE test (PrimaryKey VARCHAR2(20), UniqueKey VARCHAR2(20) ); -- 分别创建主键和唯一索引,语法不同 ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey); CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey); -- 在 USER_INDEXES 中可以看到两个索引名称 SELECT table_name,table_type,index_name,index_type,uniqueness FROM USER_INDEXES WHERE

建立索引的好处和坏处

霸气de小男生 提交于 2020-03-06 09:42:39
好处: 1、帮助用户提高查询速度 2、利用索引的唯一性来控制记录的唯一性 3、可以加速表与表之间的连接 4、降低查询中分组和排序的时间 坏处: 1、存储索引占用磁盘空间 2、执行修改操作(insert、delete、update)产生索引维护 值得注意的是:没有索引的话,会全表查找,效率非常慢 索引可以建也可以不建,如果涉及查找,最好建索引。 来源: https://www.cnblogs.com/duStar96/p/12424757.html

[搜片神器]服务器SQL2005查询分页语句你理解了么

孤街浪徒 提交于 2020-03-03 14:02:51
在 sosobt.com 网站准备采用Lucence.net来进行索引处理搜索慢问题的时候,突然发现常用的分页获取数据的row_number也支持不住了,后期查到200多万的时候非常慢(总数据有500万),经过网上查询分析一些资料后,基本上搞明白是什么原因导致的,顺便纪录一下解决方案。 ------------------------------------ 网上找的几种sqlserver2005高效分页sql查询语句 top方案: sql codeselect top 10 * from table1 where id not in(select top 开始的位置 id from table1) max: sql codeselect top 10 * from table1 where id>(select max(id) from (select top 开始位置 id from table1order by id)tt) row: sql codeselect * from ( select row_number()over(order by tempcolumn)temprownumber,* from (select top 开始位置+10 tempcolumn=0,* from table1)t )tt where temprownumber>开始位置 3种分页方式