Mysql基础调优
mysql基础的优化方式
1、利用索引加快查询速度
2、利用查询缓存或者旁挂式缓存,提高访问速度
缓存:k/v
key:查询语句的hash值
value:查询语句的执行结果
哪些查询可能不会被缓存?
查询语句中包含UDF(User-Defined Functions)
存储函数
用户自定义变量
临时表
mysql系统表或者是包含列级别权限的查询
有着不确定结果值的函数(now());
查询缓存相关的服务器变量:
query_cache_limit:能够缓存的最大查询结果,(单语句结果集大小上限)
有着较大结果集的语句,显式使用SQL_NO_CACHE,以避免先缓存再移出,也就是查询的时候用select * from students SQL_NO_CACHE
query_cache_min_res_unit:内存块的最小分配单位,缓存过小的查询结果集会浪费内存空间
较小的值会减少空间浪费,但会导致更频繁地内存分配及回收操作,较大值的会带来空间浪费
query_cache_size:查询缓存空间的总共可用的大小,单位是字节,必须是1024的整数倍
query_cache_strip_comments
query_cache_type:缓存功能启用与否;
ON:启用;
OFF:禁用;
DEMAND:按需缓存,仅缓存SELECT语句中带SQL_CACHE的查询结果;
query_cache_wlock_invalidate:如果某表被其它连接锁定,是否仍然可以从查询缓存中返回查询结果,默认为OFF表示可以,ON则表示不可以;
状态变量:
mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16759688 |
| Qcache_hits | 0 | ##查询缓存的命中率
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
mysql> show global status like '%Com_select%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 12 | ##表示查询的次数
+---------------+-------+
命中率:
Qcache_hits/Com_select
3、InnoDB存储引擎相关的参数:
innodb_buffer_pool_size:
索引、数据、插入数据时的缓冲区,数据先保存在内存缓冲区,从内存缓冲区保存到磁盘,做为专用服务器时设置为内存的70-80%;
如果数据集本身较小,可根据数据变化幅度及规划的时长设定合理值,比预估的目标值略大;
innodb_buffer_pool_instances:
buffer_pool的区段(实例)数量,内存缓冲区被分成多个区端,这样锁定的时候不会锁定整张表,可能只是锁定表的一部分
4、事务日志:
innodb_log_files_in_group:一组内事物日志文件数量,至少2个;
innodb_log_file_size:日志文件大小,默认为5M,建议调大此值;
innodb_flush_logs_at_trx_commit:
0:log buffer(内存)每秒一次同步到log file中,且同时会进行log file到data file的同步操作;也就是每秒钟一次将内存缓冲区中的数据同步到事物日志中,同时同步到数据文件中。
1:每次提交时,log buffer同步到log file,同时进行log file到data file的同步操作;
2:每次提交时,log buffer同步到log file,但不会同时进行log file到data file的同步操作;
建议:关闭autocommit,而后将此值设置为1或2;
innodb_file_per_table:innodb的诸多高级特性都依赖于此参数;
innodb_read_io_threads:
innodb_write_io_threads
文件读写的io线程数,可根据并发量和CPU核心数适当调整;
innodb_open_files:innodb可打开的文件数量上限;
innodb_thread_concurrency=内核级可以使用的线程数,一般为cpu的2倍
skip_name_resolve:
max_connections:
5、表分区:
表分区可以提高查询和写操作的效率,对表进行分区后表结构文件还是一个,但表空间文件会变成多个,查询或更改数据时只需要在表的分区内进行就可以,而不必查询整张表,大大提高效率,使每个分区单独管理、单独使用
根据范围划分:
MariaDB [mydb]> CREATE TABLE students (id INT, name VARCHAR(100), age TINYINT UNSIGNED NOT NULL, gender ENUM('F','M')) PARTITION BY range(age)(partition youngman values less than (40), partition middleman values less than (70), partition oldman values less than maxvalue);
[root@node2 ~]#for i in {1..1000};do mysql -e "insert into mydb.students values($i,'stu$i',$[$[RANDOM%90]+18],'${gender[$[RANDOM%2]]}')";done
[root@node2 mydb]#ls ##可以看到表结构文件只有一个,但表空间文件被分成了三个
db.opt students.frm students.par students#P#middleman.ibd students#P#oldman.ibd students#P#youngman.ibd
根据hash划分:
MariaDB [mydb]> CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M')) PARTITION BY hash(id) PARTITIONS 5;
[root@node2 mydb]#for i in {1..1000};do mysql -e "insert into mydb.students values($i,'stu$i',$[$[RANDOM%90]+18],'${gender[$[RANDOM%2]]}')";done
[root@node2 mydb]#ls
db.opt students.frm students.par students#P#p0.ibd students#P#p1.ibd students#P#p2.ibd students#P#p3.ibd students#P#p4.ibd
指明分区的数量; 注意这里不能对名字进行哈希,因为名字的数据类型是char或者是varchar,会补空格,所以不是确定的,就无法进行哈希,哈希的值不是确定的
根据列表划分:
MariaDB [mydb]> CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M'), majorid TINYINT UNSIGNED NOT NULL) PARTITION BY list(majorid) (PARTITION p0 VALUES IN (1,4,7), PARTITION p1 VALUES IN (2,5,8), PARTITION p2 VALUES IN (3,6,9));
[root@node2 mydb]#for i in {1..1000};do mysql -e "insert into mydb.students values($i,'stu$i',$[$[RANDOM%90]+18],'${gender[$[RANDOM%2]]}',$[$[RANDOM%9]+1])";done
[root@node2 mydb]#ls
db.opt students.frm students.par students#P#p0.ibd students#P#p1.ibd students#P#p2.ibd
6、sql mode:
定义mysqld对约束等违反时的响应行为等设定;
常用的mode:
traditional
strict_trans_tables
strict_all_tables
修改方式:
mysql> set global sql_mode='mode';
mysql> set @@global.sql_mode='mode';
总结:
1,利用索引加快查询速度
2,利用查询缓存或旁挂式缓存提供访问速度,利用变量来提高命中率。
3,表分区可以提高查询和写操作的效率
Mysql基础调优的更多相关文章
- Database基础(六):实现MySQL读写分离、MySQL性能调优
一.实现MySQL读写分离 目标: 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台M ...
- MySQL性能优化总结___本文乃《MySQL性能调优与架构设计》读书笔记!
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- MySQL性能调优的10个方法 - mysql数据库栏目
摘要: https://edu.aliyun.com/a/29036?spm=5176.11182482.related_article.1.hbeZbF 摘要: MYSQL 应该是最流行了 WEB ...
- MySQL性能调优与架构设计——第 15 章 可扩展性设计之Cache与Search的利用
第 15 章 可扩展性设计之Cache与Search的利用 前言: 前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢”,无法更为 ...
- MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分
第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我 ...
- MySQL性能调优与架构设计——第12章 可扩展设计的基本原则
第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
- MySQL性能调优与架构设计——第1章 MySQL 基本介绍
第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主 ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...
随机推荐
- iOS Block学习
iOS4已经直接支持blocks,很有必要学习一下. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其 本身又 ...
- php 解决MySQL插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
在项目中向MySQL插入数据时.发现数据插入不完整,通过调试,发现插入语句也没什么特殊的错误. 可是就是差不进去,于是就打开mysqli错误的调试 $ret = mysqli_query($this- ...
- java之static变量与全局、局部变量的区别
static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无 ...
- Intel Naming Strategy--1
http://en.wikipedia.org/wiki/Mobile_Internet_device Computer sizes Classes of computers Larger S ...
- GTK入门学习:布局容器之水平布局
假设我们希望窗体里多放加入几个控件,直接加入是不成功的.由于窗体仅仅能容纳一个控件的容器. 这时候.我们须要借助布局容器,我们先把布局容器加入到窗体里.然后再把所须要加入的控件放在布局容器里. 布局容 ...
- Makefile:1: *** 多个目标匹配。 停止。
以下是我自己写的Makefile 文件: .SUFFIXES:.c .o CC = gcc SRCS = stat.c OBJS = $(SRCS:.c=.o) EXEC = test start:$ ...
- VC++ 学习笔记(四):停止还是暂停这个系列
我已经很久没有更新这个话题了,原因是多方面的,比如比较忙,比如我参与的项目不使用C++.最近因为需要在C#的客户端中调用第三方的C++API,又想起了这个话题.在跟公司里的C++方面专家聊过之后,我有 ...
- peewee模块
Peewee Python中数据库与ORM主要做这几件事: 数据库方面由程序员设计表关系,主要是1v1,1vN,NvN: ORM做数据类型映射,将数据库表示的char/int等类型映射成Python对 ...
- putty software caused connection abort
错误现象:在非常短的时间内就失去连接.并报"Software caused connection abort" 解决的方法:首先得排除是网络不是不通畅.假设在局域网中要确定IP没有 ...
- MapReduce算法形式三:cleanup
案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...