MySQL之Schema与数据类型优化和创建高性能的索引(一)

Schema与数据类型优化

只修改.frm文件

从前面的例子中可以看到修改表的.frm文件是很快的,但MySQL有时候会在没有必要的时候也重建.如果愿意冒一些风险,可以让MySQL做一些其他类型的修改而不用重建表。下面这些操作是有可能不需要重建表的:

  • 1.移除(不是增加)一个列的AUTO_INCREMENT属性
  • 2.增加、移除,或更改ENUM和SET常量。如果移除的是已经有行数据用到其值的变量,查询将会返回一个空字符串

基本的技术是为想要的表结构创建一个新的.frm文件,然后用它替换掉已经存在的那张表的.frm文件,像下面这样:

  • 1.创建一张有相同结构的空表,并进行所需要的修改(例如增加ENUM常量)
  • 2.执行FLUSH TABLES WITH READ LOCK.这将会关闭所有正在使用的表,并且进制任何表被打开
  • 3.交换.frm文件
  • 4.执行UNLOCK TABLES来释放第2步的读锁
    下面以给sakila.film表的rating列增加一个常量为例来说明。当前列看起来如下
mysql> SHOW COLUMNS FROM film LIKE 'rating';
+--------+------------------------------------+------+-----+---------+-------+
| Field  | Type                               | Null | Key | Default | Extra |
+--------+------------------------------------+------+-----+---------+-------+
| rating | enum('G','PG','PG-13','R','NC-17') | YES  |     | G       |       |
+--------+------------------------------------+------+-----+---------+-------+
1 row in set (0.07 sec)

假设我们需要为那些对电影更加谨慎的父母们增加一个PG-14的电影分级:

mysql> CREATE TABLE film_new LIKE film;
Query OK, 0 rows affected (0.03 sec)mysql> ALTER TABLE film_new-> MODIFY COLUMN rating ENUM('G','PG','PG-13','R','NC-17','PG-14')-> DEFAULT 'G';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.02 sec)

注意,我们是在常量列表的末尾增加一个新的值。如果把新增的值放在中间,例如PG-13之后,则会导致已经存在的数据的含义被改变:已经存在的R值将变成PG-14,而已经存在的NC-17将变成R,等等。
接下来用操作系统的命令交换.frm文件

/var/lib/mysql/sakila# mv film.frm film_tmp.film
/var/lib/mysql/sakila# mv film_new.frm film.frm
/var/lib/mysql/sakila# mv film_tmp.frm film_new.frm

再回到MySQL 命令行,现在可以解锁表并且看到变更后的效果了:

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (18.96 sec)
mysql> SHOW COLUMNS FROM film LIKE 'rating';
+--------+--------------------------------------------+------+-----+---------+-------+
| Field  | Type                                       | Null | Key | Default | Extra |
+--------+--------------------------------------------+------+-----+---------+-------+
| rating | enum('G','PG','PG-13','R','NC-17','PG-14') | YES  |     | G       |       |
+--------+--------------------------------------------+------+-----+---------+-------+
1 row in set (0.09 sec)

最后要做的事删除为完成这个操作而创建的辅助表:

mysql>DROP TABLE film_new;

快速创建MyISAM索引

为了高效地载入数据到MyISAM表中,有一个常用的技巧是先禁用索引、载入数据,然后重新启用索引:

mysql>ALTER TABLE test.load_data DISABLE KEYS;
mysql>ALTER TABLE test.load_data ENABLE KEYS;

这个技巧能够发挥作用,是因为构建索引的工作被延迟到数据完全载入以后,这个时候已经可以通过排序来构建索引了,这样做会快很多,并且使得索引树的碎片更少、更紧凑。
不幸的是,这个办法对唯一索引无效,因为DISABLE KEYS只对非唯一索引有效。MyISAM会在内存中构造唯一索引,并且为载入的每一行检查唯一性。一旦索引的大小超过了有效内存大小,载入操作就会变得越来越慢。
在现代版本的InnoDB版本中,有一个类似的技巧,这依赖于InnoDB的快速在线索引创建功能。这个技巧是,先删除所有的非唯一索引,然后增加新的列,最后重新创建删除掉的索引。Percona Server可以自动完成这些操作步骤。也可以使用像前面说的ALTER TABLE的骇客方法来加速这个操作,但需要多做一些工作并且承担一定的风险。这对备份中载入数据是很有用的,例如,当已经直到所有的数据都是有效的并且没有必要做唯一性检查就可以这么来操作。
下面是操作步骤:

  • 1.用需要的表结构创建一张表,但是不包括索引。
  • 2.载入数据到表以后构建.MYD文件
  • 3.按照需要的结构创建另外一张空表,这次要包含索引。这回创建需要的.frm和.MYI文件
  • 4.获取读锁并刷新表
  • 5.重命名第二张表的.frm和MYI文件,让MySQL认为是第一张表的文件
  • 6.释放读锁
  • 7.使用REPAIR TABLE来重建表的索引。该操作会通过排序来构建所有索引,包括唯一索引

创建高性能的索引

概述。

索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。
索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响语法重要。在数据量较小时负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降(除非特别说明,假设都是硬盘驱动器。固态硬盘驱动器有着完全不同的性能特性)。不过,索引却经常被忽略,有时候甚至被误解,所以在实际案例中经常会遇到由糟糕索引导致的问题。索引优化应该是对查询性能优化是最有效的手段,索引能够轻易将查询性能提高几个数量级,"最优"的索引有时比一个"好的"索引性能要好两个数量级。创建一个真正“最有”的索引经常需要重写查询

索引基础

在MySQL中,存储引擎用类似的方法使用索引,其先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。假如要运行下面的查询:

mysql> SELECT first_name FROM actor WHERE actor_id = 5;

如果在actor_id列上建有索引,则MySQL将使用该索引找到actor_id为5的行,也就是说,MySQL先在索引上按值进行查找,然后返回所有包含该值的数据行。索引可以包含一个或者多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列,创建一个包含两个列的索引,和创建两个只包含一列的索引是大不相同的。

如果使用的是ORM,是否还需要关心索引?

简而言之:是的,仍然需要理解索引,即使是适用对象关系映射(ORM)工具。
ORM工具能够生产符合逻辑的、合法的查询(多数时候),除非只是生成非常基本的查询(例如仅是根据主键查询),否则它很难生成适合索引的查询。无论是多个复杂的ORM工具,在精妙和复杂的索引面前都是"浮云"。很多时候,即使是查询优化技术专家也很难兼顾到各种情况,更别说ORM了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE-文件IO2

文章目录 前言一、字节流1.1 读文件1.2 写文件 二、字符流2.1 读文件2.2 写文件 三、文件IO三道例题 前言 在这里对Java标准库中对文件内容的操作进行总结,总体上分为两部分,字节流和字符流,就是以字节为单位读取文件和以字符为单位读取文件…

[AI Google] 介绍 VideoFX,以及 ImageFX 和 MusicFX 的新功能

VideoFX 是来自 labs.google 的最新实验,您可以查看音乐效果和图像效果的新更新,现在在 110 多个国家可用。 生成式媒体正在改变人们构思创意并增强我们的创造力能力的方式。我们致力于与创作者和艺术家合作构建人工智能,以更好地理解这些生成…

cmake使用交叉编译工具链并验证

目录 一、内容 二、配置 1. 准备cmake文件 2. 使用交叉编译 三、验证 1. 构建阶段验证 2. 编译阶段验证 一、内容 目的:在X86环境下编译ARM平台软件 编写交叉编译配置文件:xx.cmake 执行cmake命令时指定:cmake \ -DCMAKE_TOOLCHAIN_F…

Linux Crontab:看完这篇,还有啥不懂的吗

在Linux系统管理中,自动化是一个至关重要的概念,它可以帮助我们节省时间、减少错误并提高效率。crontab> 是实现这一目标的强大工具,它允许我们安排任务在特定的时间自动执行。本文将详细介绍 crontab 的基础概念、语法、命令、高级技巧以…

K8S认证|CKA题库+答案| 12. 查看Pod日志

目录 12、查看Pod日志 CKA v1.29.0模拟系统免费下载试用: 题目: 开始操作: 1)、切换集群 2)、提取错误日志 3)、验证提取结果 12、查看Pod日志 CKA v1.29.0模拟系统免费下载试用: 百度…

简单的UDP网络程序:多人群聊系统

本章重点 能够实现一个简单的udp客户端/服务器; 1.创建套接字 我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。 ⭐参数说明: domain:创建套接字的域…

Nginx代理配置(专业版)

写在前面提醒:使用代理,如果可以,请尽量支持双协议,http、https均要支持哈。 注意:监控系统只是运行代码,是否支持https,需要运维同学在你们的服务器上配置https证书,配置好证书&…

在 CentOS 上安装 PostgreSQL 的全面指南

PostgreSQL 是一种功能强大的开源关系型数据库管理系统,广泛应用于各种领域。它提供了诸如事务处理、并发控制和数据完整性等高级功能,因此深受开发者和企业的欢迎。本指南将逐步引导您在 CentOS 上安装 PostgreSQL,以便您充分利用其众多优势…

决定了,将ChatGPTer开源!主打一个大模型人人可用。

一个快速上手且极易部署的类ChatGPT开源应用,可接入 OPENAI API 或 通义千问API 开源地址: https://github.com/isnl/EsChat 大声(偷偷)告诉你:通义千问有免费API额度可白嫖!!! 版本特性 OPENAI 和 通义千…

点云AABB、OBB包围盒计算显示

目录 一、简介 1)AABB包围盒 2)OBB包围盒 二、计算代码 三、加载计算结果

什么是Promise

Promise 是 JavaScript 中的一个对象,用于处理异步操作。它代表了一个最终可能完成(也可能被拒绝)的异步操作及其结果值。Promise 对象用于更复杂的异步编程模式,包括使用 .then() 和 .catch() 链式调用来处理异步操作的结果。 P…

算法提高之区间最大公约数

算法提高之区间最大公约数 核心思想&#xff1a;线段树 1.在区间上加一个数 差分 2.求一段区间的最gcd 求[l,r]的gcd 可以拆解为求**[1,l].sum(差分数组 求出来时l点的值)和[l1,r]**做gcd #include <iostream>#include <cstring>#include <algorithm>usi…

1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 题目链接&#xff1a;1738. 找出第 K 大的异或坐标值 代码如下&#xff1a; //列前缀异或和 //参考链接:https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/solutions/2790359/liang-chong-fang-fa-er-wei-qian-zhui-yi-68…

Docker数据卷(volume)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。&#xff08;容器内目录与宿主机目录对应的桥梁&#xff0c;修改宿主机对应的目录&#xff0c;docker会映射到容器内部&#xff0c;相当于修改了容器内的&#xff0c;反之也一样&#xff09;数…

利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

检索增强生成 (Retrieval Augmented Generation&#xff0c;RAG) 可将存储在外部数据库中的新鲜领域知识纳入大语言模型以增强其文本生成能力。其提供了一种将公司数据与训练期间语言模型学到的知识分开的方式&#xff0c;有助于我们在性能、准确性及安全隐私之间进行有效折衷。…

任推邦:实力强劲的APP推广拉新平台,号称不扣量

任推邦简介 任推邦是国内数一数二的项目分发平台&#xff0c;也是一个不扣量的项目APP推广拉新平台&#xff0c;隶属于聚名科技集团股份有限公司。聚名科技成立时间在2012年&#xff0c;是安徽省老牌互联网企业&#xff0c;历经11年的飞速发展&#xff0c;聚名科技成功布局打造…

小程序的这些知识你知道吗?

一:导航传参 无论是编程式还是声明式导肮传参都是在url?keyvalue&key1value1,无论是否是tabbar页面. 对于回退页面,没办法传参. 这个参数是,跳转到页面的时候,跳转到另一个页面,这个页面就是刚开始执行,等数据执行之后,触发onload,传递的参数放在内存中,跳转是内部底层触…

云端力量:利用移动云服务器高效部署Spring Boot Web应用

文章目录 一、移动云介绍二、移动云产品选择三、体验云主机ECS四、使用移动云服务器部署SpringBoot Web应用4.1移动云ECS安装JDK4.2移动云ECS安装MySQL4.3移动云ECS数据库插入数据4.4移动云ECS部署Spring Boot Web应用 总结 一、移动云介绍 移动云是中国移动基于自研的先进技术…

Linux中常见的基本指令(上)

目录 一、ls指令 1. ls 2. ls -l 3. ls -a 4.ls -F 二、qwd指令 三、cd指令 1. cd .. 2. cd / / / 3. cd ../ / / 4. cd ~ 5. cd - 五、mkdir指令 六、rmdir指令和rm指令 一、ls指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 。 功能 &#xff1a;对于目录…

桶排序和基数排序

前言&#xff1a; 这篇文章&#xff0c;我们就来了解一些鲜为人知的排序&#xff0c;桶排序和基数排序。 桶排序&#xff1a; 桶排序的思想&#xff1a; 桶排序的思想就是把待排序的数尽量均匀地放到各个桶中&#xff0c;再对各个桶进行局部的排序&#xff0c;最后再按序将各…