技术博客

Mysql性能调优(一)

admin2021-01-12 18:47 497人已围观

简介最近一直在找数据分析岗位的时候,面试的时候,问的最多的就是mysql相应的相关问题,尤其是数据库调优的相关知识点。当然,在其他的岗位也需要mysql的相关操作,

前言

最近一直在找数据分析岗位的时候,面试的时候,问的最多的就是mysql相应的相关问题,尤其是数据库调优的相关知识点。当然,在其他的岗位也需要mysql的相关操作,比如我们的java开发、运维等相关的岗位。针对于此,本人最近利用空余时间学习mysql优化的相关知识,其中主要包括Linux安装、索引的相关知识、视图、存储过程、存储函数以及触发器的相关内容,针对最近大家都在参加秋招,本人利用自己学到的知识写成文章,希望对大家的秋招有所帮助。数据库mysql调优这部分内容打算在10篇文章的左右把这部分内容介绍给大家。但是需要大家注意的是:由于此系列文章是介绍mysql调优,因此,在大家阅读此部分文章的时候,需要大家有最基本的mysql相关知识,这样的话,大家或许收获的内容更多。

本篇文章主要介绍在Linux中安装mysql5.7、详细地介绍了索引的相关的知识,主要包括索引的基本概念、索引的优劣势、以及索引的底层原理以及索引的相关操作。

一、在Linux系统上安装mysql

在很多计算机企业中,我们一般都是在Linux环境下进行开发。因此,在介绍mysql调优之前,首先给大家介绍mysql在Linux中安装以及配置。

我们在安装mysql之前,首先要在自己的电脑上安装好Linux虚拟机,由于篇幅问题,本人就不做介绍了,如果没有安装的可以去参考这篇文章。接下来我们给大家介绍如何在Linux中安装mysql。

1、 Linux下下载mysql包

首先我们用Linux命令下载Linux安装包

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

当然我们也可以在官网去下载,然后通过其他的工具去上传到Linux特定的文件下。具体如图所示:

2、安装mysql

1、大家应该知道,Linux在安装的时候默认地安装了mysql,因此,在先安装mysql之前首先卸载默认安装的mysql。我们通过以下的命令来检查是否已经安装过mysql:

 rpm -qa | grep mysql

2、从执行结果,可以看出我们已经安装了mysql-libs-5.1.73-5.el6_6.x86_64,执行删除命令

rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64

再次执行查询命令,查看是否删除

3、查询所有Mysql对应的文件夹

[root@localhost /]# whereis mysqlmysql: /usr/bin/mysql /usr/include/mysql[root@localhost lib]# find / -name mysql/data/mysql
/data/mysql/mysql

删除相关目录或文件

[root@localhost /]#  rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql

验证是否删除完毕

[root@localhost /]# whereis mysqlmysql:[root@localhost /]# find / -name mysql[root@localhost /]#

4、检查mysql用户组和用户是否存在,如果没有,则创建

[root@localhost /]# cat /etc/group | grep mysql[root@localhost /]# cat /etc/passwd |grep mysql[root@localhost /]# groupadd mysql[root@localhost /]# useradd -r -g mysql mysql[root@localhost /]#

5、在执行wget命令的目录下或你的上传目录下找到Mysql安装包:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

[root@localhost /]#  tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz[root@localhost /]# lsmysql-5.7.24-linux-glibc2.12-x86_64
mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

解压完成后,可以看到当前目录下多了一个解压文件,移动该文件到/usr/local/下,并将文件夹名称修改为mysql。

这里需要注意的是:如果/usr/local/下已经存在mysql,请将已存在mysql文件修改为其他名称,否则后续步骤可能无法正确进行。

具体的命令如下:

[root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/[root@localhost /]# cd /usr/local/[root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql

如果/usr/local/下不存在mysql文件夹,直接执行如下命令,也可达到上述效果。

[root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql

6、在/usr/local/mysql目录下创建data目录

[root@localhost /]# mkdir /usr/local/mysql/data

7、更改mysql目录下所有的目录及文件夹所属的用户组和用户,以及权限

[root@localhost /]# chown -R mysql:mysql /usr/local/mysql[root@localhost /]# chmod -R 755 /usr/local/mysql

8、编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)

[root@localhost /]# cd /usr/local/mysql/bin[root@localhost bin]# ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

3、启动mysql服务

我们可以通过以下命令进行启动mysql服务

service mysql start
service mysql stop
service mysql status
service mysql restart

4、登录mysql

在mysql安装成功之后,会自动生成一个随机的密码,并且保存在一个密码文件中:

/root/.mysql_secret

接着我们可以用以下命令登录了

mysql -u root -p

登陆之后修改密码:

set password = password("itcast");

授权远程访问:

grant all privileges on *.* to 'root'@'%' identified by 'itcast' with grant option;

最后将配置写入 mysql 授权表中:

flush privileges;

以上就是在Linux环境下安装以及启动mysql的相关内容,希望大家在学习mysql调优之前首先安装好mysql,这样的话,大家可以跟着实操,加深对相关内容的理解。如果在安装过程中遇到任何问题,可以去网上搜索相关问题。

二、索引

接下来,我们在安装好mysql的前提下,一起学习mysql性能调优,首先给大家介绍索引的相关概念及其操作。

1、索引概述

索引是帮助mysql高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引,具体实现如下:

其中图中的左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址,这里需要注意的是:逻辑上相邻的记录在磁盘上并不是一定在物理上相邻的。为了加快col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应的数据。

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。

2、索引的优势、劣势

索引的优势如下:

1、类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本
2、通过索引列对数据进行排序,降低数据排序成本,降低CPU的消耗

索引的劣势如下:

  • 实际上索引也是一张表,该表中保存了主键与索引的字段,并指向实体类的记录,所以索引列也是要占用空间的

  • 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行insert、update、delete。因为在更新表示时,mysql不仅要保存数据,还要保存一下索引文件每次更新添加索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

3、索引结构

索引是在mysql的存储引擎层中实现的,而不是在服务层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。mysql目前提供了以下4种索引:

  • BTREE索引:最常见的索引类型,大部分索引都支持B树索引

  • Hash索引:只有memory引擎支持,使用场景简单

  • R-tree索引(空间索引):空间索引是myisam引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特别介绍

  • Full-text(全文索引):全文索引也是myisam的一个特殊索引类型,主要用于全文索引,innodb从mysql版本5.6开始支持全文索引。

接下来给大家介绍innodb、myisam、memory三种存储引擎对各种索引类型的支持,具体如下:

因此,我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引。其中包括聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree树索引,统称为索引。

接下来,给大家介绍BTREE结构。BTREE又叫做多路平衡搜索树,一颗m叉的Btree特性如下:

  • 树中的每个节点最多包含m个孩子

  • 除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子

  • 若根节点不是叶子节点,则至少有两个孩子

  • 所有的叶子节点都在同一层

  • 每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1]

接下来,我们以5叉BTree为例,key的数量:根据公式推导可得[ceil(m/2)-1]4时,中间节点分裂到父节点,两边节点分裂。

1、首先我们插入前4个字母CNGA,具体入下:

2、插入H,n>4,中间元素G字母向上分裂到新的节点

3、插入E,K,Q不需要分裂

4、插入M,中间元素M字母向上分裂到父节点G

5、插入F,W,L,T不需要分裂

6、插入Z,中间元素T向上分裂到父节点中

7、插入D,中间元素D向上分裂到父节点中。然后插入P,R,X,Y不需要分裂

8、最后插入S,NPQR节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间结点的M向上分裂。

到此,该BTREE树就已经构建完成了,BTREE树和二叉树相比,查询数据的效率更高,因为对于相同的数值量来说,BTREE的层级结构比二叉树小,因此搜索速度快。

前面给大家介绍B+Tree为BTree的变种,B+Tree与BTree的区别为:

1、n叉B+tree最多含有n个key,而BTree最多含有n-1个key。
2、B+Tree的叶子节点保存所有的key信息,依key大小顺序排列
3、所有的非叶子节点都可以看作是key的索引部分

由于B+Tree只有叶子节点保存key的信息,查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定。

最后,给大家在介绍mysql中B+Tree。Mysql索引的数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

Mysql中的B+Tree索引结构示意图:

4、索引的分类

前面给大家介绍了索引索引的相关概念以及索引的结构,接下来,给大家介绍索引的分类。索引只要分为单值索引、唯一索引、复合索引。

  • 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引

  • 唯一索引:索引列的值必须唯一,但允许有空值

  • 复合索引:即一个索引包含多个列

5、索引语法

索引在创建表的时候,可以同时创建,也可以随时增加新的索引。首先我们要准备相应的数据。

create database demo_01 default charset=utf8mb4;use demo_01;create table `city`(
	`city_id` int(11) not null auto_increment,
	`city_name` varchar(50) not null,
	`country_id` int(11) not null,
	primary key (`city_id`),)ENGINE=Innodb default charset=utf8;

由于篇幅问题,接下来就以图片形式展现给大家建表的过程:

接下来我们插入数据。

接下来,我们在刚才建立表的基础上进行创建索引。

create [union|fulltext|spatial] index index_name[using index_type] on tb1_name(index_col_name,……)这里的index_col_name:column_name[(length)][ASC|DESC]

以上是创建索引的语法,我们以city表为例来创建city_name字段创建的索引;

create index_city_name on city(city_name);

其效果如下:

接下来就是查看索引的语法

show index from table_name;

以上是查看索引的语法,我们以city表为例来查看city_name字段的索引信息;

show index from city\G;

接下来,给大家介绍删除索引的语法

drop index index_name on tb1_name;

以上是删除索引的语法,我们以city表为例来删除city_name字段的索引;

drop index index_name on tb1_name;

最后给大家介绍ALTER命令,具体语句如下:

alter table tb_name add primary key(column_list);# 该语句添加了一个主键,这意味着索引值必须是唯一的,且不能为NULLalter table tb_name add unique index_name(column_list);# 这条语句创建索引的值必须唯一的(除了NULL外,NULL可能会出现多次)alter table tb_name add index index_name(column_list);# 添加普通索引,索引值可以出现多次alter table tb_name add fulltext index_name(column_list)# 该语句指定了索引为fulltext,用于全文索引

6、索引设计的原则

索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。

1、对查询频次较高,且数据量比较大的表建立索引
2、索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的组合。
3、使用唯一索引,区分度越高,使用索引的效率越高
4、索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然就很高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话,mysql也会有一种选择的困难,尽管最终会找到一个可用的索引,但无疑提高了选择的代价。
5、使用短索引,索引创建之后也是使用硬盘来存储的,因此,提升索引访问的I/O效率,也可以提升总体的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效提升mysql访问索引的I/O效率。
6、利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询sql可以利用组合索引来提升查询效率。
# 创建复合索引:create index index_name_email_status on tb_seller(name, email, status);#就相当于:对name,创建索引;#对name,email创建索引;#对name,email,status创建索引;

索引的基础部分就已经全部介绍完毕了,我们分别从索引的概述、优势、劣势、索引的结构、分类、语法以及索引设计的原则。希望通过这部分我们对索引有一个基础的了解。

总结

本文开始给大家介绍mysql优化的相关内容,需要我们有mysql一些基本基础。本文首先给大家介绍了在Linux下安装以及登录mysql。其次,给大家详细介绍了mysql中的索引相关知识,包括索引的概述、索引的优势以及存在的一些问题、索引的底层原理以及索引的分类、语法和设计原则。mysql是很重要的一个技能,几乎计算机中的每个岗位都需要一个mysq技能,因此,需要我们特别的掌握。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!

最后,今天是一年一度的1024,祝大家节日快乐!!!


  • 微信公众号

很赞哦!(0)

注:本文转载自知乎,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。

文章评论


评论0

    站点信息

    • 微信公众号:扫描二维码,关注我们