精华内容
下载资源
问答
  • 一、MYSQL索引的分类 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找...MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE),普通索引(INDEX)和全文索...

    一、MYSQL索引的分类

    索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。这比按顺序读取每一行要快得多。

    MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE) ,普通索引(INDEX)和全文索引(FULLTEXT) 。

    主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替。

    唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须一。

    普通索引:这是最基本的索引,它没有任何限制。

    全文索引:FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR, VARCHAR和 TEXT列。

    二、索引的创建方式

    (1)主键索引的创建方式:

    方式1:ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

    比如:ALTER TABLE users ADD PRIMARY KEY ( id )

    方式2:创建表的时候指定主键

    (2)唯一索引的创建方式

    方式1:ALTER TABLE `table_name` ADD UNIQUE  [indexName] (`column`)

    比如:ALTER TABLE users ADD UNIQUE ( id )

    方式2:CREATE UNIQUE INDEX index_name ON table_name (column_name)

    比如:CREATE UNIQUE INDEX index_users ON users(id)

    (3)普通索引的创建方式

    方式1:ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

    比如:ALTER TABLE users ADD INDEX index_users( id )

    方式2:CREATE INDEX index_name ON table_name (column_name)

    比如:CREATE INDEX index_users ON users (column_name)

    (4)全文索引的创建方式

    方式1:ALTER TABLE `table_name` ADD FULLTEXT ( `column` )

    比如:ALTER TABLE users ADD FULLTEXT ( id )

     

    展开全文
  • 一、MYSQL索引的分类索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以...MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE),普通索引(INDEX)和全文索引(FU...

    一、MYSQL索引的分类

    索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。这比按顺序读取每一行要快得多。

    MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE) ,普通索引(INDEX)和全文索引(FULLTEXT) 。

    主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替。

    唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须一。

    普通索引:这是最基本的索引,它没有任何限制。

    全文索引:FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR, VARCHAR和 TEXT列。

    二、索引的创建方式

    (1)主键索引的创建方式:

    方式1:ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

    比如:ALTER TABLE users ADD PRIMARY KEY ( id )

    方式2:创建表的时候指定主键

    (2)唯一索引的创建方式

    方式1:ALTER TABLE `table_name` ADD UNIQUE  [indexName] (`column`)

    比如:ALTER TABLE users ADD UNIQUE ( id )

    方式2:CREATE UNIQUE INDEX index_name ON table_name (column_name)

    比如:CREATE UNIQUE INDEX index_users ON users(id)

    (3)普通索引的创建方式

    方式1:ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

    比如:ALTER TABLE users ADD INDEX index_users( id )

    方式2:CREATE INDEX index_name ON table_name (column_name)

    比如:CREATE INDEX index_users ON users (column_name)

    (4)全文索引的创建方式

    方式1:ALTER TABLE `table_name` ADD FULLTEXT ( `column` )

    比如:ALTER TABLE users ADD FULLTEXT ( id )

    展开全文
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快,今天在我的虚拟机中布置了环境,测试抓图如下:抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致...

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快,

    今天在我的虚拟机中布置了环境,测试抓图如下:

    53f65d8fac5706cb1cad3772d4f6fee5.png

    抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同,而且如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引。

    谷歌一下:

    唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。

    补充下概念:

    1、普通索引

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

    2、唯一索引

    普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。

    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

    注:

    终于找到同事说执行效率不一样的原因了,他在普通索引上创建的是前缀索引,只取了前16个字节,而唯一索引使用的全字节 :)

    展开全文
  • 唯一索引普通索引的区别 一、背景介绍 索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时Mysql必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,这...

    唯一索引和普通索引的区别

    • 一、背景介绍

    索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时Mysql必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,这个操作的代价就越高,如果作为搜索条件的列上已经创建了索引,mysql无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有一千个记录,通过索引查找记录至少要比顺序扫描记录快100倍。所以对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。

    • 二.知识剖析

    1.MySQL都有哪些索引类型呢?

    mysql提供多种索引类型供选择:普通索引,唯一索引,主键

    全文索引,单列索引,与多列索引

    2.普通索引

    普通索引的唯一任务是加快对数据的访问速度,因此,应该只为那些最经常出现在查询条件(WHERE column=)或者排序条件(ORDERBY column)中的数据列创建索引

    3.主键

    必须为主键字段创建一个索引,这个Mysql索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE

    4.唯一性索引

    如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候,就应该用关键字UNIQUE把它定义为一个唯一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。如果是,mysql将拒绝插入那条新纪录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复

    5.索引的优点

    5.1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性

    5.2.建立索引可以大大提高检索的数据,以及减少表的检索行数

    5.3.在表连接的连接条件,可以加速表与表直接的相连

    5.4.在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)

    5.5.建立索引,在查询中使用索引,可以提高性能。

    6.索引的缺点

    6.1.创建索引和维护索引,会耗费时间,随着数据量的增加而增加

    6.2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间

    6.3.当对表的数据进行INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件)。

    • 三.常见问题

    1.如何创建索引

    2.隐式类型转换对MySQL选择索引的影响。

    3.什么情况下建索引。

    4.什么情况不建索引。

    5.索引对查询提高多少性能?

    • 四.解决方案

    1.SQL插入索引语句。

    1.1普通索引:ALTER TABLE’table-name’ ADD INDEX index_name(‘column’)

    1.2唯一索引:ALTER TABLE’table-name’ ADD UNIQUE(‘column’)

    1.3主键索引:ALTER TABLE’table-name’ ADD PRIMARY KEY (‘column’)

    2.当文本字段与数字进行比较时,由于类型不同,MySQL需要做隐式类型转换才能进行比较。

    默认转换规则是:不同类型全都转换为浮点型m,如果字段是字符,条件是整型,那么会把表中字段全都转换成整型

    3.1.在经常需要搜索的列上,可以加快索引的速度

    3.2主键列上可以确保列的唯一性(手机号,身份证号,银行卡号)。

    3.3在表与表的而连接条件上,加上索引,可以加快连接查询的速度。

    3.4.在经常需要排序(order by)分组(group by)和distinct列上加索引可以加快排序查询的时间,(单独order by用不了索引,索引考虑加where或者加limit)

    3.5.尽量选择区分度高的列作为索引。

    3.6.索引列不能参与计算,保持列“干净”。

    3.7.尽量的扩展索引,不要新建索引。

    4.1.查询中很少使用到的列,不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求。。

    4.2很少数据的列也不应该建立索引,比如一个性别字段0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率。

    4.3定义为text和image和bit数据类型的列不应该增加索引。

    4.4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作时互斥的关系。

    5.见运行编码效果

    更多讨论

    1.MySQL索引方法有几种?

    答:MySQL目前主要有以下几种索引方法:B-Tree,Hash,R-Tree。

    2.B-Tree和Hash的区别是什么?

    答: 1、B-Tree

    B-Tree是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,而且可以直接支持数据排序(ORDER BY)

    B-Tree在MyISAM里的形式和Innodb稍有不同:

    MyISAM表数据文件和索引文件是分离的,索引文件仅保存数据记录的磁盘地址

    InnoDB表数据文件本身就是主索引,叶节点data域保存了完整的数据记录

    2、Hash索引

    2.1.仅支持"=",“IN"和”<=>"精确查询,不能使用范围查询:

    由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的Hash算法处理之后的Hash

    2.2.不支持排序:

    由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算

    2.3.在任何时候都不能避免表扫描:

    由于Hash索引比较的是进行Hash运算之后的Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果

    2.4.检索效率高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引

    2.5.只有Memory引擎支持显式的Hash索引,但是它的Hash是nonunique的,冲突太多时也会影响查找性能。Memory引擎默认的索引类型即是Hash索引,虽然它也支持B-Tree索引

    3.为什么索引类型不一样,但不同类型的索引方式还是B-Tree和Hash呢?

    百度找不到答案,师兄们也不知道,咋整?暂时存疑。

    4.不通过SQL语句,在java里面怎么创建索引?

    用两个Map搞定

    Map wenjname=new HashMap();///索引是数字,内容是文件名

    Map dcjc=new HashMap();///索引是单词,内容是上面的索引

    一个Map的话,也可以但是我觉得很费资源啊

    作者:素履之往_3e36
    链接:https://www.jianshu.com/p/dd4fe101cffe
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快今天在我的虚拟机中布置了环境,测试抓图如下:抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同...
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快,今天在我的虚拟机中布置了环境,测试抓图如下:抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致...
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快今天在我的虚拟机中布置了环境,测试抓图如下:抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同...
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快
  • 面试题mysql 普通索引唯一索引区别。 同一个查询普通索引唯一索引效率比较? change buffer 是什么?什么场景适合change buffer ? 为什么普通索引查询有时候比唯一索引
  • 结论:唯一索引不一定比普通索引快,要分情况讨论 查询时: 未使用limit1的情况,唯一索引匹配到一条数据后即返回;普通索引回继续匹配下一条数据,发现不匹配后才返回。 从这里看,唯一索引比较普通索引少了一次...
  • 昨天有位同事说,他的网页查询过程中发现普通索引唯一索引的效率是有差别的,普通索引比唯一索引快, 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取...
  • MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录10...
  • YSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100...
  • MYSQL索引用来快速地寻找那些具有特定值的记录...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100倍。 mysql在使用like查询中,能不能用到索引?在什么地方使用索引呢? 在使用like的时候,如果使用
  • ​MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100...
  • MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100倍...
  • MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100...
  • 通过该类型的索引可以比普通索引更快速地查询某条记录。 创建表时定义索引 CREATE TABLE tablename( propname1 type1, …… propnamen type…n, UNIQUE INDEX | KEY [indexname] (propnamen [(length)] [ ASC | DESC...
  • MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录10...
  • YSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个...如果表有1000个记录,通过索引查找记录至少要顺序扫描记录100...
  • YSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有...如果表有1000个记录,通过索引查找记录至少要顺序扫描记...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

唯一索引比普通索引快