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);
        [[email protected] ~]#for i in {1..1000};do mysql -e "insert into mydb.students values($i,‘stu$i‘,$[$[RANDOM%90]+18],‘${gender[$[RANDOM%2]]}‘)";done
        [[email protected] 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;
        [[email protected] mydb]#for i in {1..1000};do mysql -e "insert into mydb.students values($i,‘stu$i‘,$[$[RANDOM%90]+18],‘${gender[$[RANDOM%2]]}‘)";done
        [[email protected] 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));
        [[email protected] 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
        [[email protected] 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,表分区可以提高查询和写操作的效率

原文地址:https://www.cnblogs.com/shenxm/p/8469951.html

时间: 2025-01-17 06:01:50

Mysql基础调优的相关文章

Database基础(六):实现MySQL读写分离、MySQL性能调优

一.实现MySQL读写分离 目标: 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成 其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询 方案: 使用4台RHEL 7.2虚拟机,如下图所示.其中192.168.4.10.192.168.4.20分别作为MySQL主.从服务器,是整个服务的后端:另一台 192.168.4.100作为MyS

MySQL性能调优与架构设计——第1章 MySQL 基本介绍

MySQL性能调优与架构设计——第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主要内容包括MySQL 各功能模块组成,各模块协同工作原理, Query 处理的流程等. 1.1 MySQLServer 简介 1.1.1 什么是 MySQLMySQL 是由MySQL AB公司(目前已经被SUN公司收归麾下,SUN已经被Oracle收购)自主研发的,目

MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分

第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈.这时候,我们就必须许找其他技术手段来解决这个瓶颈,那就是我们这一章所要介绍恶的数据切分技术. 14.1 何谓数据切分 可能很多读者朋友在网上或者杂志上面都已经多次见到关于数据切分的相关文章了,只不过在有些文章中称之为数据的 Sharding.其实不管是称之为数据的 Shard

MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体系,提升系统的扩展能力,通过组合多个低处理能力的硬件设备来达到一个高处理能力的系统,也就是说,我们必须进行可扩展设计.可扩展设计是一个非常复杂的系统工程,所涉及的各个方面非常的广泛,技术也较为复杂,可能还会带来很多其他方面的问题.但不管我们如何设计,不管遇到哪些问题,有些原则我们还是必须确保的.本章

MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优化,存储引擎的相关参数设置建议将主要在下一章“常用存储引擎的优化”中进行说明. 10.1 MySQL 安装优化 选择合适的发行版本 1. 二进制发行版(包括RPM等包装好的特定二进制版本) 由于MySQL开源的特性,不仅仅MySQL AB提供了多个平

MySQL 性能调优

MySQL 性能调优 索引 索引是什么 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料. 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成?

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

101个MySQL的调优技巧(1)

MySQL是一个功能强大的开源数据库. 随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限. 这里是101条调节和优化MySQL安装的技巧. 一些技巧是针对特定的安装环境的,但这些思路是通用的. 我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中--在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是

linux系统基础调优

linux系统基础调优 1.   关闭selinux,清空iptables sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config grep SELINUX=disabled /etc/selinux/config setenforce 0 iptables -F iptables -X iptables -Z iptables -L /etc/init.d/iptables save 2.    添加普通用户并进行s