mysql创建索引

04讲深入浅出索引(上)

眉间皱痕 提交于 2020-02-18 07:35:36
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。 数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。 索引的常见模型 索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。 下面我主要从使用的角度,为你简单分析一下这三种模型的区别。 哈希表是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。 不可避免地

索引

纵然是瞬间 提交于 2020-02-16 21:11:03
索引其实就是为了提高数据查询的效率,就像书的目录一样 索引常见的三种模型: ①哈希表:k-v结构,适用于只有等值查询的场景,范围查询效率低 【插入速度很快:计算key值即可存储】 ②有序数组:等值查询和范围查询的性能就都非常优秀 【查询性能最好,效率都是二分法O(log(N)),但插入成本太高(插入一个记录就必须挪动后面所有记录)】 ∴ 有序数组索引只适用于静态存储引擎 ③搜索树:数据库使用的都是N叉搜索树 【由于读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中】 使用N叉而不使用二叉的原因: 虽然二叉搜索树效率最高,但是 索引不止存在内存中,还要写到磁盘上 。 树高决定访问数据块的时间 , 在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。对于一个 100 万行的表, 如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间。 一个查询想尽量少读磁盘,查询过程必须访问尽量少的数据块 所以 虽然二叉树搜索效率高,但往往查询可能很慢; 为了提升查询效率,使用N叉树, “N 叉”树中的“N”取决于数据块的大小 以 InnoDB 的一个整数字段索引为例,N 差不多是 1200。这棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。 而树根的数据块总在内存中的,一个 10 亿行的表上一个整数字段的索引

mysql 常见语法

眉间皱痕 提交于 2020-02-16 19:01:53
一、数据库简单介绍 1、 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系统中,关系型数据库使用最为广泛。面向对象数据库则是由面向对象语言催生的新型数据库,目前的一些数据库系统,如:SQL Server 2005、Oracle10g等都开始增加面向对象的特性。 二、常用基本SQL语句/语法 Ø SQL 语句基础理论 SQL是操作和检索关系型数据库的标准语言,标准SQL语句可用于操作然后关系型数据库。 标准的 SQL 语句通常划分为以下类型: 查询语句: 主要由于select关键字完成,查询语句是SQL语句中最复杂,功能最丰富的语句。 DML (Data Munipulation Language,数据操作语言)语句,这组DML语句修改后数据将保持较好的一致性;操作表的语句,如插入、修改、删除等; DDL (Data Definition Language,数据定义语言)语句,操作数据对象的语言,有create、alter、drop。 DCL (Data Control Language,数据控制语言)语句,主要有grant、revoke语句。 事务控制语句: 主要有commit、rollback和savepoint三个关键字完成 DDL 语句 DDL语句是操作数据库对象的语句

千万级别的数据库优化

放肆的年华 提交于 2020-02-16 07:19:04
前言 平时在写一些小web系统时,我们总会对mysql不以为然。然而真正的系统易用应该讲数据量展望拓展到千万级别来考虑。因此,今天下午实在是无聊的慌,自己随手搭建一个千万级的数据库,然后对数据库进行一些简单的CRUD来看看大数据情况下的CRUD效率。 结果发现,曾经简单的操作,在数据量大的时候还是会造成操作效率低下的。因此先写下这篇文章,日后不断更新纪录一下自己工作学习到的Mysql优化技巧。 搭建千万级数据库 首先,需要一个测试环境。一开始想到的是写一个SImple JDBC程序然进行简单的数据INSERT。结果发现单线程情况下,每次INSERT了一百多万条的时候效率就变得非常的低下。但是程序也没报OUT MEMORY之类的异常。初步判断应该是单一线程不断的疯狂创建PrepareStatement对象CG没来得及清理造成内存逐渐被吃紧的原因。 后来改进了一下,用多线程的机制。创建十个进程,每个负责一万条数据的插入。这效率一下子提升了好几倍。然而好景不长,很快的Java程序报错:OUT MEMORY。内存溢出了,CG没来得及清理。 这可把我给急的了。插入的太快内存CPU吃紧,插入的太慢又失去了创建测试环境“快”的初衷。后来想了下,既然是要批量插入数据,那么不是可以简单的写一段数据库存储过程吗? 于是,先建立一张测试表,就叫goods表吧。先写sql语句创建表: CREATE

MySQL 常见引擎总结

人走茶凉 提交于 2020-02-14 08:03:55
MySQL 引擎 1.InnoDB存储引擎 InnoDB给MySQL的表提供了事 务处理、回滚、崩溃修复能力 和多版本并发控制的事务安全。 InnoDB存储引擎总支持AUTO_INCREMENT。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键。 InnoDB还支持外键(FOREIGN KEY)。当删除、更新父表中的某条信息时,子表也必须有相应的改变,这是数据库的参照完整性规则。 nnoDB中,创建的表的表结构存储在.frm文件中(我觉得是frame的缩写吧)。数据和索引存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中。 InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大 InnoDB:在mysql5.6版本以上被作为默认引擎,并且加入了行及锁定与外键约束。 所以以下是使用InnoDB最好的选择: 1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 4.外键约束。MySQL支持外键的存储引擎只有InnoDB。 5.支持自动增加列AUTO_INCREMENT属性。 2

从原理到优化,深入浅出数据库索引

半世苍凉 提交于 2020-02-13 23:44:06
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序

MySQL查看SQL语句执行效率

萝らか妹 提交于 2020-02-13 08:06:17
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain select … from … [where ...] 例如:explain select * from news; 输出: +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 下面对各个属性进行了解: 1、id:这是SELECT的查询序列号 2、select_type:select_type就是select的类型,可以有以下几种: SIMPLE:简单SELECT(不使用UNION或子查询等) PRIMARY

MySQL—索引(Index)

牧云@^-^@ 提交于 2020-02-12 16:56:13
关于MySql索引数据结构和实现原理的讲解值得阅读一下: https://www.cnblogs.com/songwenjie/category/1268974.html 1.什么是索引: MySQL官方对索引的定义: 索引(Index)是帮助MySQL高效获取数据的数据结构。 提取句子的主干,就可以得到索引的本质:索引就是数据结构。 2.索引的分类 在一个表中,主键索引只能有一个,而唯一索引可以有多个 1. 主键索引 (PRIMARY KEY)   特点:唯一标识,不可重复。只能有一列作为主键,且主键不可为Null。 2. 唯一索引 (UNIQUE KEY)   特点:避免重复的列出现,唯一索引可以重复,多个列都可以标识为 唯一索引。 3. 常规索引 (KEY/INDEX)   特点:默认的,index。key关键字来设置 4. 全文索引 (FullText)   特点:在特定的数据库引擎下才有,MyISAM,可以快速定位数据 3.MySQL索引创建与使用(基础语法) 参考博客: https://blog.csdn.net/justry_deng/article/details/81458470 索引一旦创建则不能修改,如果要修改索引,只能删除重建。可以使用 DROP INDEX index_name ON table_name; 删除索引。 4.索引 优势和劣势 优势:1

MySQL经典面试题

爱⌒轻易说出口 提交于 2020-02-12 04:24:22
MySQL经典面试题 1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)

MySQL经典面试题

孤人 提交于 2020-02-12 03:49:55
MySQL经典面试题 1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)