Mysql基础调优

##mysql基础的优化方式node

一、利用索引加快查询速度
二、利用查询缓存或者旁挂式缓存,提升访问速度
	缓存: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 
三、InnoDB存储引擎相关的参数:
	innodb_buffer_pool_size:
		索引、数据、插入数据时的缓冲区,数据先保存在内存缓冲区,从内存缓冲区保存到磁盘,作为专用服务器时设置为内存的70-80%;
		若是数据集自己较小,可根据数据变化幅度及规划的时长设定合理值,比预估的目标值略大;
	innodb_buffer_pool_instances:
		buffer_pool的区段(实例)数量,内存缓冲区被分红多个区端,这样锁定的时候不会锁定整张表,可能只是锁定表的一部分
四、事务日志:
	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:
五、表分区:
	表分区能够提升查询和写操做的效率,对表进行分区后表结构文件仍是一个,但表空间文件会变成多个,查询或更改数据时只须要在表的分区内进行就能够,而没必要查询整张表,大大提升效率,使每一个分区单独管理、单独使用
	根据范围划分:
		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
六、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,表分区能够提升查询和写操做的效率
相关文章
相关标签/搜索