索引概述
Posted 91洲际哥的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引概述相关的知识,希望对你有一定的参考价值。
Ⅰ、什么是索引
索引是一种提高数据库查询效率的数据结构(我们说的一般都是B+ tree索引)
([email protected]) [test]> show create table l \G
*************************** 1. row ***************************
Table: l
Create Table: CREATE TABLE `l` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`a`), -- 主键
UNIQUE KEY `c` (`c`), -- 唯一索引
KEY `b` (`b`) -- 普通索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.08 sec)
一张表可以有多个索引,索引就是对创建索引的这些列进行排序
优点:
使查询速度变得非常快,且这个快基本上和数据量没关系
缺点:
很多索引都要排序则要对这些索引列进行维护,直接插入本来很快,但是有了索引做ddl操作则代价比较大,虽说不能太多索引列,但是大场景下很难做大
tips:
主键和唯一索引的区别:
- 一张表只能有一个主键,唯一索引可以有多个
- 主键不可以为NULL,唯一索引可以
mysql一张表的大小是多少?
很多人说一张表不能太大,太大要拆表?这么说的两个原因(oracle没这个说法):
a.MySQL之前的DDL操作,比较麻烦,创建了索引,再做这些会表锁(全局读锁),数据量太大会锁时间太长,也就是之前不支持online ddl嘛。以前都是先在slave上搞,搞好做个主从的切换
b.之前MySQL的索引源代码的实现上有一把大锁,导致性能比较一般,不过没有淘宝这个业务量基本上影响不大,但是5.7也解决了这个问题
综上:MySQL5.7这时候,索引本身已经实现地很完整了(管理和性能两个方面),一亿不是什么问题
tips:
- 大锁:索引排序的时候做一个split的操作(也不会一直做split),拆分,本来把拆分的两个页锁住即可,但是那时候是整个B+ tree锁住了,并发性就受到影响比较大了,
- 用MySQL就得上SSD,单表能承受1亿根本不是什么大问题,一个亿和一千万,查询和维护代价基本上都是一样的,五年前五百万分表或许是适合的,现在就算了吧
- sas盘的iops再怎么优化也只有一千,拆了最多是管理操作方便点,但也有问题,某个时间点数据不一定一致,比如某个时间点,这个表比另一个表多一个列,sas五百万或者一千万差不多了,可以做个raid10,ssd做raid5或者不做都可以
- 电商平台,快递行业,一个月前的订单,归档,用分区表来做,和性能没关系,只是一个管理操作,也就是说分区表不是用来提升性能的,反而会下降,除非都走分区字段,但是线上查询条件太多太多
再强调:
1.MySQL用SSD
2.拆表不会提升性能
3.现在不存在最多多少记录的问题
以上是关于索引概述的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException:键 f0 的片段不再存在:索引 1
javascript UV Index Monitor App订阅PubNub并显示UV索引值。博文的代码片段。在这里查看项目:https:// githu
c_cpp UV Index Indicator订阅PubNub并使用颜色显示UV索引值。博文的代码片段。在这里查看项目:https:/