唯一索引

MySQL 索引的面试题总结

China☆狼群 提交于 2019-12-02 09:18:06
什么是索引? 索引是一种能帮助 MySQL 提高查询效率的数据结构。 索引分别有哪些优点和缺点? 索引的优点如下: 快速访问数据表中的特定信息,提高检索速度。 创建唯一性索引,保证数据表中每一行数据的唯一性。 加速表与表之间的连接。 使用分组和排序进行数据检索时,可以显著减少查询中分组和排序的时间。 索引的缺点: 虽然提高了的查询速度,但却降低了更新表的速度,比如 update、insert,因为更新数据时,MySQL 不仅要更新数据,还要更新索引文件; 建立索引会占用磁盘文件的索引文件。 使用索引注意事项: 使用短索引,短索引不仅可以提高查询速度,更能节省磁盘空间和 I/O 操作; 索引列排序,MySQL 查询只使用一个索引,因此如果 where 子句中已经使用了索引的话,那么 order by 中的列是不会使用索引的,因此数据库默认排序可以符合要求的情况下,不要进行排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引; like 语句操作,一般情况下不鼓励使用 like 操作,如果非使用不可, 注意 like “%aaa%” 不会使用索引,而like "aaa%"可以使用索引; 不要在列上进行运算; 不适用 NOT IN 和 <> 操作。 以下 SQL 有什么问题?该如何优化? select * from t where f/2=100; 该 SQL

唯一索引与主键索引的比较

跟風遠走 提交于 2019-12-02 06:52:38
唯一索引与主键索引的比较 唯一索引 唯一索引不允许两行具有相同的索引值。 如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保 存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。 例如,如果在employee 表中的职员姓氏(lname) 列上创建了唯一索引,则所有职员不能同姓。 主键索引 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。 主键索引要求主键中的每个值是唯一的。 当在查询中使用主键索引时,它还允许快速访问数据。 它们的一些比较: (1)对于主健/unique constraint ,oracle/sql server/mysql等都会自动建立唯一索引; (2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的; (3)主健可作外健,唯一索引不可; (4)主健不可为空,唯一索引可; (5)主健也可是多个字段的组合; (6)主键与唯一索引不同的是: a.有not null属性; b.每个表只能有一个。 1、主键 主键ID,主键既是约束也是索引,同时也用于对象缓存的键值。 2、索引 *组合或者引用关系的子表(数据量较大的时候),需要在关联主表的列上建立非聚集索引

Mysql_索引

有些话、适合烂在心里 提交于 2019-12-02 05:15:46
一、MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构。用于提高查找效率,可以比作字典。可以简单理解为排好序的快速查找的数据结构。 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句)。 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据。这样就可以在这些数据结构上实现高级查找算法。这些数据结构就是索引。 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上。 我们平时所说的索引,如果没有特别指明,一般都是B树索引。(聚集索引、复合索引、前缀索引、唯一索引默认都是B+树索引),除了B树索引还有哈希索引。 优点: A、提高数据检索效率,降低数据库的IO成本 B、通过索引列对数据进行排序,降低了数据排序成本,降低了CPU的消耗。 缺点: A、索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是占用空间的。 B、对表进行INSERT、UPDATE、DELETE操作时,MYSQL不仅会更新数据,还要保存一下索引文件每次更新添加了索引列字段的相应信息。 在实际的生产环境中我们需要逐步分析,优化建立最优的索引,并要优化我们的查询条件。 索引的分类: 1、单值索引 一个索引只包含一个字段,一个表可以有多个单列索引。 2、唯一索引

Navicat Premium怎么设置字段的唯一性(UNIQUE)?

只愿长相守 提交于 2019-12-02 03:37:40
参考链接:https://blog.csdn.net/Song_JiangTao/article/details/82192189 1、打开你想要设计的表 这里写图片描述 2、清楚你想要设计哪个字段为唯一的,例如我这里是设计name字段唯一,然后点击索引 这里写图片描述 3、然后设置相关内容 这里写图片描述 说明: 名:索引名 字段:想要设计的那个UNIQUE字段名,这里可以选择,也可以直接输入 索引类型:当然是选择UNIQUE啦 索引方法:可以不写,默认如图 注释:就是注释啦 4、点击左上角的保存。 5、测试,当你插入相同name值的记录时,就会报出如下错误 来源: https://www.cnblogs.com/manmanchanglu/p/11729331.html

Oracle语句优化30个规则详解

大憨熊 提交于 2019-12-01 20:12:57
1. 选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST ( 基于成本 ) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。 在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 2. 访问Table的方式Oracle采用两种访问表中记录的方式: a. 全表扫描 全表扫描就是顺序地访问表中每条记录。 ORACLE采用一次读入多个数据块(database

mysql面试题目笔记 <非原创> (作为自己的参考资料)

a 夏天 提交于 2019-12-01 11:58:10
1.主键超键候选键外键是什么? 定义: 超键:在关系中可以唯一标识元组的属性集。 初始键:不包含多余属性的超键。 主键:用户选作元组标识的一个附加键程序主键。 外键:如果关系R中的属性集是关系L中的主键,那么该属性集为关系R的外键。 超键 在关系中能唯一标识元组的属性集称为关系模式的超键。 这样我们从示例中可以发现学号是标识学生实体的唯一标识。那么该元组的超键就为学号。 除此之外我们还可以把它跟其他属性组合起来,比如: ( 学号 , 性别 ) ( 学号 , 年龄 ) 这样也是超键。 初始键 排除多余属性的超键为预期键。 根据示例可知,学号是一个可以唯一标识元组的唯一标识,因此学号是一个附加键,实际上,指向键是超键的子集,而非(学号,年龄)是超键,但是它不是预设键。因为它还有了额外的属性。 主键 用户选择的预设键作为该元组的唯一标识,那么它就以此为主键。 简单的说,示例中的元组的扩展键为学号,但是我们将他作为该元组的唯一标识,那么学号就以此为主。 外键 外键是相对于主键的,某些在学生记录里,主键为学号,在成绩单表中也有学号插入,因此学号为成绩单表的外键,为学生表的主键。 总结 主键为预期键的子集,外部键为超键的子集,而外键的确定是相对于主键的。 2.数据库事务的四个特性: ACID:原子性,一致性,隔离性,持久性。 原子性:数据库的所有操作要么完成,要么全部不完成

面试官:谈谈你对mysql索引的认识?

南笙酒味 提交于 2019-12-01 08:49:52
引言 大家好,我渣渣烟。我曾经写过一篇 《面试官:讲讲mysql表设计要注意啥》 ,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mysql面试题。还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎。 ps :其实很早就想写了,一直偷懒! 其实这下面每个问题,我都可以讲一篇文章出来!而且这些问题,不是我凭空编的。如下图所示( 注意看第三题 ) 所以我回忆了一下,索引常见考点有哪些,总结成了这篇文章! 主要题目有下面这些 (1)你一般怎么建索引的? (2)讲讲索引的分类?你知道哪些? (3)如何避免回表查询?什么是索引覆盖? (4)现在我有一个列,里头的数据都是唯一的,需要建一个索引,选唯一索引还是普通索引? (5)mysql索引是什么结构的?用红黑树可以么? (6)mysql某表建了多个单索引,查询多个条件时如何走索引的? 正文 1、你一般怎么建索引的? 烟哥注: 曾记得有一个粉丝来找我的时候,出现如下搞笑一幕 渣渣烟:"你这个简历上写了拥有SQL优化经验,你怎么建索引的? " 只见该粉丝嘿嘿一笑..说道:"就那样建啊…" 渣渣烟:"噢(第二声),就哪样建啊…" 粉丝:"…就网上说的那些索引规则啊" 渣渣烟:"那你怎么知道那些SQL出问题,需要建索引呢? " 粉丝:"我….." 嗯

基于oracle的sql优化

时光总嘲笑我的痴心妄想 提交于 2019-11-30 21:46:56
一.编写初衷描述 【博客地址】http://www.cnblogs.com/grl214 在应有系统开发初期,由于数据库数据较少,对于sql语句各种写法的编写体现不出sql的性能优劣,随着数据的不断增加,出现海量数据,劣质sql与优质sql在执行效率甚至存在百倍差距,可见sql优化的重要性 二.Sql语句性能优化 2.1 认识Oracle的执行过程 2.2 Oracle优化法则---漏斗法则 2.3 Oracle 执行计划 2.3.1 什么是Oracle执行计划 执行计划是一条查询语句在Oracle中执行过程或者访问路径的描述. 2.3.2 查看Oracle执行计划 1.执行计划常用的列字段解释 基数:返回的结果集行数 字节:执行该步骤后返回的字节数 耗费(cust),CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好. 2.3.3 看懂Oracle执行计划 2.3.3.1执行顺序 根据缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行) 2.4 表的访问方式 TABLE ACCESS FULL(全表扫描) TABLE ACCESS BY ROWID(通过rowid的表存取) TABLE ACCESS BY INDEX SCAN(索引扫描) 2.4.1 ABLE ACCESS FULL(全表扫描) Oracle会读取表中的所有行

mysql 锁机制 详解 一

a 夏天 提交于 2019-11-30 16:44:02
1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。 注: MySQL是一个支持插件式存储引擎的数据库系统

数据库索引的所用,有点和缺点

时间秒杀一切 提交于 2019-11-30 11:01:13
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。 第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列 上创建索引,例如: 在经常需要搜索的列上,可以加快搜索的速度;