【MYSQL】索引

一、 数据库索引中的主键和索引

1、表加上主键的结构转变

数据库建立主键的时候是默认会建立索引的,这个索引叫做聚集索引,平时我们建立的索引叫做非聚集索引。
主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。
我们平时建表的时候都会为表加上主键,在某些关系型数据库中,如果建表不加主键的话,数据库会拒绝建表语句的执行。一个没加主键的表,它的数据是无需的放置在磁盘存储器上,一行一行的排列很征求,但是如果给表加上了主键的话,那么表在磁盘上的存储结构就由整齐排列的结构转化为了树状结构,也就是“平衡树结构”,换句话说就是整个表变成了一个索引,也就是所谓的“聚集索引”。这就是为什么一个表只能有一个【主键】,一个【聚集索引】,因为主键的作用就是把表的数据结构转换成索引(平衡树)的格式放置。

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

每次给字段创建一个新索引,字段中的数据就会被复制一份出来,用于生成索引。因此,给表添加索引,会增加表的体积,占用磁盘的空间。
聚集索引和非聚集索引的区别在于,通过聚集索引可以查到需要查找的数据,而通过非聚集索引可以查到记录对应的主键值,而使用主键的值通过聚集索引查找需要的数据,如下图:

3、一个表中可以拥有多个非聚集索引,但是只能有一个聚集索引。非聚集索引可以分成:普通索引,唯一索引,全文索引

4、聚集索引对数据的更新影响很大,写入性能不高,因为需要频繁移动对应数据的物理位置,变化平衡树。使用聚集索引的查询效率要比非聚集索引的效率要高

5、mysql常见索引

PRIMARY KEY(主键索引)
ALTER TABLE table_name ADD PRIMARY KEY ( column )
UNIQUE(唯一索引)
ALTER TABLE table_name ADD UNIQUE (column)
INDEX(普通索引)
ALTER TABLE table_name ADD INDEX index_name ( column )
FULLTEXT(全文索引)
ALTER TABLE table_name ADD FULLTEXT ( column )
组合索引
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

6、Mysql各种索引区别:

普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则

7、Mysql索引主要有两种结构:B+树和hash.

hash:hsah索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.当时因为是hash结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.
B+树:b+tree是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.

8、explain sql执行计划

(1)type mysql在表中找到所需行的方式,即访问类型(从左往右,性能从差到好)
(差)All ->index->range->ref->eq_ref->const,system->null(好)
全表->全索引->索引范围->普通索引->唯一索引->唯一查询->不使用表的查询(select 1 from dual)
(2)rows扫描行的数量
(3)key实际使用到的索引

9、Arraylist

(1)ArrayList在初始化的默认大小?
Arraylist底层是个数组,有参和无参调用的构造函数是不一样的,无参的时候默认调用的构造函数会给数组一个初始化的值是10,建立一个长度为10的数组。1.7以前会调用this(10)才是真正的容量为10,1.7即本身以后是默认走了空数组,只有第一次add的时候才会容量变成10。
(2)Arraylist的扩容?
Arraylist可以存放任意数量对象,长度不受限制,是因为它通过数组扩容来实现的。假设现在长度为10,已经满了,需要新增加一个元素,那么arraylist会重新定义一个长度为10+10/2的数组也就是一个长度为15的数组(扩容即为1.5倍),把原数据原封不动的复制在新数组中,再把原数的地址指向新的数组。Arraylist传入的初始大小可以是大于等于0的数,如果小于0,将会抛出异常。建立失败,不传入参数的话就使用默认的大小10(1.8之后调用add方法才会容量才会变成10)。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量
扩容公式:int newCapacity = oldCapacity + (oldCapacity >> 1);
(3)Jdk1.7和jdk1.8 ArrayList初始化的区别是什么?
ArrayList在1.7的时候变化是在初始化的时候,1.7以前会调用this(10)才是真正的容量为10,1.7即本身以后是默认走了空数组,只有第一次add的时候才会容量变成10。(懒加载机制,不使用的时候不会占用这10个内存空间)
(4)Arraylist的默认数组大小为什么是10?
(5)我记得你说到了,他增删很慢,你能说一下ArrayList在增删的时候是怎么做的么?主要说一下他为啥慢。
(6)我问你个真实的场景,这个问题很少人知道,你可要好好回答哟!
ArrayList(int initialCapacity)会不会初始化数组大小?
(7)ArrayList插入删除一定慢么?
(8)ArrayList是线程安全的么?
(9).size()方法计算的是实际元素,空元素不被包含在内

10、hash函数

Hash函数往往运用于查找上,在使用hash函数前,还需要明白它几个限制。
(1)Hash函数的主要原理就是把大范围映射到小范围
(2)由于逼近单向函数,所以可以使用hash函数对数据进行加密
(3)不同的应用对hash函数有着不同的要求。用于查找的hash函数主要考虑它映射到小范围的时候的冲突率

Hash函数的主要对象是数组(比如:字符串),而其目标一般是个int类型
一般来说hash函数可以分为以下几类:
1、 加法hash
2、 位运算hash
3、 乘法hash
4、 除法hash
5、 查表hash
6、 混合hash
7、 数组hash
https://www.cnblogs.com/barrywxx/p/10739871.html

为什么能够提高查询速度?

索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。
举个例子:
表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍!
在一个或者一些字段需要频繁用作查询条件,并且表数据较多的时候,创建索引会明显提高查询速度,因为可由全表扫描改成索引扫描。
(无索引时全表扫描也就是要逐条扫描全部记录,直到找完符合条件的,索引扫描可以直接定位)
不管数据表有无索引,首先在SGA的数据缓冲区中查找所需要的数据,如果数据缓冲区中没有需要的数据时,服务器进程才去读磁盘。
1、无索引,直接去读表数据存放的磁盘块,读到数据缓冲区中再查找需要的数据。
2、有索引,先读入索引表,通过索引表直接找到所需数据的物理地址,并把数据读入数据缓冲区中。
索引有什么副作用吗?
(1)索引是有大量数据的时候才建立的,没有大量数据反而会浪费时间,因为索引是使用二叉树建立.
(2)当一个系统查询比较频繁,而新建,修改等操作比较少时,可以创建索引,这样查询的速度会比以前快很多,同时也带来弊端,就是新建或修改等操作时,比没有索引或没有建立覆盖索引时的要慢。
(3)索引并不是越多越好,太多索引会占用很多的索引表空间,甚至比存储一条记录更多。
对于需要频繁新增记录的表,最好不要创建索引,没有索引的表,执行insert、append都很快,有了索引以后,会多一个维护索引的操作,一些大表可能导致insert 速度非常慢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值