码迷,mamicode.com
首页 > 其他好文 > 详细

索引概述

时间:2018-06-07 14:15:30      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:区别   怎么   提高   创建   inno   sla   default   索引排序   strong   

Ⅰ、什么是索引

索引是一种提高数据库查询效率的数据结构(我们说的一般都是B+ tree索引)

(root@localhost) [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.现在不存在最多多少记录的问题

索引概述

标签:区别   怎么   提高   创建   inno   sla   default   索引排序   strong   

原文地址:https://www.cnblogs.com/---wunian/p/9149647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!