mysql创建索引

MySQL学习之索引

十年热恋 提交于 2019-12-16 22:53:52
目录 为什么需要索引 索引是什么 索引的本质 索引的目的 索引的副作用 索引的多与少 预读 索引的两大类型 索引的实现方式 b+树索引的分类 索引的种类 索引总结 为什么需要索引 在平常的应用系统中,一般的插入和修改操作很少出现性能方面的问题, 平时我们常遇到的、也是最容易出现问题的还是查询操作,所以对查询语句的优化是非常重要的。 索引可以在不读取整个表的情况下,使数据库应用程序可以更快地查找数据。 索引是什么 索引在MySQL中也称为“键”,是存储引擎快速查找到记录的一种数据结构。 索引的本质 本质就是不断地缩小想要查询数据内容的范围来获取最终我们想要的结果, 同时将随机事件变成顺序事件 索引的目的 加快数据的查询速度 索引的副作用 索引会减慢数据插入和更新的速度 更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新 因此,理想的做法是仅仅在常常被搜索的列 ( 以及表 ) 上面创建索引 索引的多与少 不管索引多还是少都会出现性能问题,所以需要找到一个平衡点。 预读 当经历一次IO时,OS不光把当前磁盘地址的数据读入内存, 还把相邻的磁盘地址的数据读入内存缓冲区内。 经历一次IO读入的数据称之为页,具体多少与OS有关 索引的两大类型 索引的两大类型hash与btree hash类型的索引:查询单条快,范围查询慢 btree类型的索引:b+树

Explain详解与索引最佳实践

混江龙づ霸主 提交于 2019-12-16 22:23:54
相信大多数的java开发程序员,日常工作,免不了涉及数据库的增删改查。而当你写完一句查询语句后,你肯定在想,如果可以事先知道该语句的执行效率,那就可以一定程度上避免设计出糟糕的语句了。那这种工具有吗?还真的有,那就是Explain。 使用EXPLAIN关键字可以模拟数据库优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。 Explain分析实战 说明下实验环境,博主使用的mysql数据库为8.0.18 MySQL Community Server - GPL,运行在阿里云的centos服务器上。 数据库初始化脚本如下,创建了三张表,student学生信息表,course课程信息表,stuent_course学生选课评教表。 DROP TABLE IF EXISTS ` student ` ; CREATE TABLE ` student ` ( ` id ` bigint ( 14 ) NOT NULL , ` name ` varchar ( 45 ) NOT NULL , ` sex ` CHAR ( 1 ) NOT NULL , PRIMARY KEY ( ` id ` ) ) ENGINE = InnoDB DEFAULT

mysql的优化(经典必看)

穿精又带淫゛_ 提交于 2019-12-16 17:37:11
mysql的优化(经典必看) 1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL ,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来

数据库之锁详解

一曲冷凌霜 提交于 2019-12-16 14:14:12
一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

PHP 之Mysql优化

别等时光非礼了梦想. 提交于 2019-12-16 13:23:18
一、建立索引 普通索引 index: 对关键字没有要求。 唯一索引 unique index: 要求关键字不能重复。同时增加唯一约束。 主键索引 primary key: 要求关键字不能重复,也不能为NULL。同时增加主键约束。 全文索引 fulltext key: 关键字的来源不是所有字段的数据,而是从字段中提取的特别关键词。 索引的管理: 建表时 更新表结构 1、前缀索引 建立前缀索引的语法: alter table test add KEY (name(5)); name一定是字符类型(索引字段),5为长度 那好,如何确定取前面几个字符呢?显然,这个场景是一个观察的结果,也就是说,必须要有一定量的实际数据,我们才能分析出其规律,也就是说这个索引是在后期优化得来的,前期没必要建立。 计算不重复的概率: select COUNT(DISTINCT name) / COUNT(*) as rate from test; 找出接近rate的一个n(试出最合理的n) select COUNT(DISTINCT LEFT(name, 3)) / COUNT() as rate3 from test; select COUNT(DISTINCT LEFT(name, 5)) / COUNT() as rate5 from test; select COUNT(DISTINCT LEFT

7 MySQL的维护、性能优化

不想你离开。 提交于 2019-12-16 03:14:56
《MySQL实战45讲》 Rows_examined:https://blog.csdn.net/weixin_34332905/article/details/90683568 恢复数据库:https://blog.51cto.com/laobaiv1/1960846 性能优化:https://www.cnblogs.com/angelica-duhurica/p/11303281.html 1 MySQL有哪些“饮鸩止渴”提高性能的方法 1.1 短连接风暴 解决: 方法1 先处理掉那些占着连接但是不工作的线程。 建议是处理掉查询任务之类的连接,插入的就不处理,避免数据库状态有损 方法2 减少连接过程的消耗。 让数据库跳过权限验证阶段 1.2 慢查询性能问题 在MySQL中,会引发性能问题的慢查询,有以下三种可能: 索引没有设计好; SQL语句没写好; MySQL选错了索引。 1.2.1 索引没有设计好 ⼀般通过紧急创建索引来解决 MySQL 5.6版本以后,创建索引都支持Online DDL了,对于那种高峰期数据库已经被这个语句打挂了的情况,最高效的做法就是直接执行alter table 语句。 比较理想的是能够在备库先执行; 假设现在的服务是⼀主⼀备:主库A、备库B,这个方案的大致流程是这样的: 在备库B上执行 set sql_log_bin=off ,也就是不写binlog

数据库优化之索引对DML语句效率的影响

人盡茶涼 提交于 2019-12-16 01:23:18
索引是一个可以提高select查询最有效的手段,可以在数据库中为一列或者多列建立索引,创建索引首先将数据按照从小到大排序,让后存储到存盘中。Mysql中数据存储以页的方式存储,页大小默认16K,存放数据的称之为表页,存放索引的称之为索引页,两者存储角度没有什么区别,但是表页一般相互独立,而索引页之间的关系呈树形结构。 根据树的层级结构划分:根节点、叶子节点、分支节点。叶子结点存储索引列排序后的值,同时存储相邻页的编号和值对应行所在表页的编号,根节点和分支节点主要存储索引列的范围,以及每个范围对应的索引页号。 假设有一个没有索引的表,当要查询表中的某些记录时,需要把所有表页都加载到内存中,在每个表页中筛选出符合的记录以二维表形式返回给用户。若表中的数据量比较大,会有很大的IO开销,而且在筛选数据时CPU的负载也很大,这种方式称之为“全表扫描”。而使用索引时,只需要根据查询范围(前期sql中使用索引)迅速定位到索引表的叶子结点和相关的表页。此期间只需要加载部分索引页和表页即可,减少了IO和CPU的负载,可以很大程度上提高查询效率。但是索引的建立需要审时度势,当表的查询频率比较低,建立索引只会占用磁盘空间,而且索引的空间占用还不小,另外表的数据量大小就更没必要建立索引,总不能书的目录比正文还厚吧,哈哈! 下面使用一个实验来测试索引对DML语句的影响。首先创建两张表test1,test2:

MySQL面试总结

浪尽此生 提交于 2019-12-14 20:29:18
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键,适用于频繁的查询。表锁,不会出现死锁,适合小数据和小并发。 - 为什么不会出死锁?(没有事务就不会继续持有锁) 答:因为`MyISAM`再查询的时候,会同时锁定这个`sql`里面所有用到的表(获取锁的顺序是一致的),不局限与一张表,再写锁又重叠时,就得等待。 **注意:【`MySQL5.5`之前默认的是`MyISAM`引擎了,5.5之后的版本默认都是`innodb`作为存储引擎】** `innodb`:支持事务安全的存储引擎,适用于插入和更新,支持外键,行锁,事务。适合大数据,大并发。特别是针对多个并发和`QPS`较高的情况。 - `QPS:`就是每秒查询率,`QPS`是对一个特定服务器再规定时间内能处理多少流量的衡量标准。 - `TPS:`就是每秒传输处理的事务个数。 - `innodb`的行锁模式:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。(注意:如果`sql`语句没有使用索引,`innodb`不能确定操作的行时,使用意向锁(表锁))。 - 死锁问题 - 什么是死锁? 死锁就是当俩个事务都需要获取对方持有的排他锁才能完成事务的时候,就导致了循环锁等待

索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!

落爺英雄遲暮 提交于 2019-12-14 09:32:08
前言 Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结。自上上篇写了 手动搭建Redis集群和MySQL主从同步(非Docker) 和上篇写了 动手实现MySQL读写分离and故障转移 之后,索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家。 这篇博客我会谈谈对于索引结构我自己的看法,以及分享如何从零开始一层一层向上最终理解索引结构。 从一个简单的表开始 create table user( id int primary key, age int, height int, weight int, name varchar(32) )engine = innoDb; 相信只要入门数据库的同学都可以理解这个语句,我们也将从这个最简单的表开始,一步步地理解MySQL的索引结构。 首先,我们往这个表中插入一些数据。 INSERT INTO user(id,age,height,weight,name)VALUES(2,1,2,7,'小吉'); INSERT INTO user(id,age,height,weight,name)VALUES(5,2,1,8,'小尼'); INSERT INTO user(id,age,height,weight,name)VALUES(1,4,3,1,'小泰'); INSERT INTO user(id

mysql的概念理解(上)

让人想犯罪 __ 提交于 2019-12-13 16:57:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这是一篇设计mysql数据库时候的一些小结。主要是对对MYISAM和INNODB俩种引擎进行简单介绍,还有表的一些属性进行详细介绍。 MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作, InnoDB:这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。 在数据表里添加一个字段,该字段所拥有的属性是:(phpmyadmin字段查看与解释) 名字(field): 字段直接在数据表显示的名字(字段名) 类型(type):常用的类型int(整数型,一般用来储存手机号,学号,平台的编号,或者自增的id) varchar和char