sql优化

MySql数据库优化

…衆ロ難τιáo~ 提交于 2020-01-21 14:05:44
数据库优化,是一种综合性的技术,不是通过某一种方式让数据库效率提高很多,而是通过各个方面的优化,来是数据库效率明显的稳步的提高。 主要包括以下: 1、库表的设计优化(三种范式) 2、 库表添加合适的索引(普通索引+主键索引+唯一索引+全文索引) 3、 分表技术-水平分割与垂直分割 4、 读写分离(add/delete/update与select分开) 5、 多用存储过程和触发器(模块化编程) 6、 优化MqSql配置(配置最大并发数,调整缓存大小,my.ini) 7、SQL优化与慢查询 8、 定时清楚垃圾数据,定时进行碎片整理( MyISAM ) 除此之外,还有 MqSql服务器硬件升级 以下进行详细描述 题外话: 存储引擎: MyISAM : 查询速度快,插入速度快,但不支持 事务 ,碎片多; InnoDB :5.5版本后Mysql的默认数据库,支持事务,支持ACID事务,支持行级锁定; Memory :所有数据置于内存中,拥有极高的插入,适合频繁的数据更新,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失,不需要保存滴; 数据库三种模式结构/三级模式 外模式(用户):用户所能看到的数据视图,可通过数据库操纵语言对数据进行操作; 模式(概念):用户视图的最小并集,所有数据的逻辑结构和概念的描述; 内模式(物理):实际存储组合,内部视图

MySQL 主从分离(读写分离)原理

好久不见. 提交于 2020-01-21 14:05:22
文章来源: https://www.cnblogs.com/php826291930/p/11242436.html 因为看了觉得通俗易懂,就转载了次文章,以做备份,如果侵犯原作者相应权利,请第一时间联系我进行删帖 1、what 什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、why 为什么要读写分离呢? 因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。 但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。 所以读写分离,解决的是,数据库的写入,影响了查询的效率。 3、when 什么时候要读写分离? 数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。 4、主从复制与读写分离 在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据

MySQL 优化---索引实战(三)

时光毁灭记忆、已成空白 提交于 2020-01-21 05:44:40
MySQL索引B+Tree优化实战 环境说明 Centos版本: CentOS Linux release 7.7.1908 (Core) Linux连接工具:SecureCRT MySQL Version: 5.7.28 MySQL连接工具:Navicate 知识扩展 Mysql中的UTF8是0-3个字节,Java中的UTF8是0-4个字节 ,在MySQL中设置字符集UTF8mb4才是0-4个字节 在MySQL4.0版本一下varchar代表的是字节 在MySQL4.0版本之后varchar代表的是字符 思考: char(10)能存储多少个中文?多少个英文? varchar(10)能存储多少个中文?多少个英文? 参考文档:https://dev.mysql.com/doc/refman/5.7/en/char.html 索引概念 索引是什么? 索引是帮助MySQL高效获取数据的数据结构! 官方解释:索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行 开始,然后通 读整个表以找到相关的行。表越大,花费时间越长。如果表中有相关 列的索 引 MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有 数据。这比顺序读取每一行要快得多。 索引能干什么? 高数据查询的效率。 索引会影响where后面 的查找和order by 后面的排序。 索引的种类

MySQL性能优化(1)

我怕爱的太早我们不能终老 提交于 2020-01-21 01:25:23
MySQL性能优化(1) MySQL单实例与多实例 MySQL多实例的优缺点 MySQL多实例的实现场景 JSON类型 JSON_EXTRACT()函数 JSON_OBJECT()函数 JSON_INSERT()函数 JSON_MERGE()函数 MySQL单实例与多实例 实例:MySQL数据库由后台线程及一个共享内存区组成,数据库实例才是真正用于操作数据库文件的程序集,是一个动态概念。 多实例就是在一台服务器上同时开启多个不同的数据库服务端口(例如3306、3307),同时运行多个数据库进程就是多实例。 MySQL多实例的优缺点 优点 :充分利用服务器资源。 缺点 :资源抢占问题。 MySQL多实例的实现场景 中小型公司的选择:公司业务访问量不大,希望不同的业务使用不同的数据库服务而互相不受影响,建于资金不足,可食用多实例,比如可以通过3台服务器部署9-15个实例,交叉做主从复制、数据备份及读写分离,这样也能达到多个服务器只装1个数据库的效果。 并发访问不是很大的业务:当业务访问量不大,服务器资源基本都是空闲的,这时很适合多实例应用,如果对sql语句优化较好,多实例是一个很值得使用技术,即使并发打,合理分配资源以及搭配号服务,问题也不大。 门户网站应用:门户网站通常会使用多实例,因为配置硬件好的服务器,可以节省IDC机柜空间,同时运行多个实例可以减少资源浪费情况

MySQL SQL优化之字符串索引隐式转换

社会主义新天地 提交于 2020-01-20 22:17:40
之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结构: CREATE TABLE `test_1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(30) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 查看执行计划,可以看出进行了全表扫描,并没有用上user_id的索引。 mysql> explain select * from test_1 where user_id=1; +----+-------------+--------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows

MySQL SQL优化

匆匆过客 提交于 2020-01-20 15:47:38
SQL优化大全 索引优化 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20 http://5.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3 6

SQL优化策略

依然范特西╮ 提交于 2020-01-20 15:29:43
策略1.尽量全值匹配 EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'; EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25; EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev'; 策略2.最佳左前缀法则 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且 不跳过索引中的列 。 策略3.不在索引列上做任何操作 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。 EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July'; 策略4.范围条件放最后 存储引擎不能使用索引中范围条件右边的列 策略5.覆盖索引尽量用 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select * 策略6.不等于要甚用 mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描 策略7.Null/Not 有影响 注意null/not null对索引的可能影响 策略8.Like查询要当心 like以通配符开头('%abc...'

MySQL存储过程详解 mysql 存储过程

旧时模样 提交于 2020-01-20 05:39:49
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言 SQL 语句在执行的时候需要要先编译,然后执行,而存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1). 存储过程增强了 SQL 语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2). 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3). 存储过程能实现较快的执行速度。如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化

数据库表索引碎片和sql性能分析

寵の児 提交于 2020-01-20 04:27:52
查询碎片 SELECT table_name , ROUND ( ( blocks * 8 ), 2 ) "高水位空间 k" , ROUND ( ( num_rows * avg_row_len / 1024 ), 2 ) "真实使用空间 k" , ROUND ( ( blocks * 10 / 100 ) * 8 , 2 ) "预留空间(pctfree) k" , ROUND ( ( blocks * 8 - ( num_rows * avg_row_len / 1024 ) - blocks * 8 * 10 / 100 ), 2 ) "浪费空间 k" FROM user_tables WHERE temporary = 'N' and table_name in ( 'MAIN_TABLE1', 'MAIN_TABLE2', 'MAIN_TABLE3' ... ) ORDER BY 5 DESC ; 说明:如果有碎片浪费空间最好都清理一下。 建议清理碎片程度计算范围 1-(真实使用空间/高水位空间)>8% 2、主表开启行迁移 begin for idx in ( SELECT 'alter table ' || table_name || ' enable row movement;' row_cur FROM user_tables WHERE table_name in

centos7安装mysql5.6

天大地大妈咪最大 提交于 2020-01-20 03:56:41
环境 CentOS 7.1 (64-bit system) MySQL 5.6.24 CentOS 安装 参考: http://www.waylau.com/centos-7-installation-and-configuration/ 依赖 MySQL 依赖 libaio,所以先要安装 libaio yum search libaio # 检索相关信息 yum install libaio # 安装依赖包 成功安装,提示如下: [root@bogon /]# yum install libaio 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.yun-idc.com * extras: mirrors.163.com * updates: mirrors.163.com 软件包 libaio-0.3.109-12.el7.x86_64 已安装并且是最新版本 无须任何处理 检查 MySQL 是否已安装 yum list installed | grep mysql 如果有,就先全部卸载,命令如下: yum -y remove mysql-libs.x86_64 若有多个依赖文件则依次卸载。当结果显示为 Complete!即卸载完毕。 下载 下载 MySQL Yum