mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)
1 通过handler_read 查看索引使用情况
如果索引经常被用到 那么handler_read_key的值将很高,这个值代表了一个行被索引值读的次数, 很低的值表明增加索引得到的性能改善不高,索引并不经常使用。
handler_read_rnd_next 的值高 则意味着查询运行低效,应该建立索引, 这个值表示在数据文件中读下一行的请求数,如果是正进行大量扫描 值会较高,一般是索引不正确或没有利用到索引。
SHOW STATUS LIKE 'Handler_read%';
2. 优化定期分析表
analyze 语句用于分析和存储表的关键字分布,分析的结果将可以使得系统得到准确的统计信息,使得sql能够生成正确的执行计划。如果用户感觉实际执行计划并不是预期的执行计划,执行一次分析表可能会解决问题。 在分析时使用一个读取锁对表进行了锁定,这个对于myisam,bdb,innodb表有作用。
-- 分析表
ANALYZE TABLE city;
3. 优化检查表
check 检查表的作用是检查一个或多个表是否有错误。check table对myisam和innodb表有作用。
-- 检查表
CHECK TABLE city;
4. 优化optimize
如果一个表已经删除了一大部分,更者对可变长度行的表(varchar,blob,text)进行了很多更改,则就使用optimize table命令来进行优化, 它是将表空间碎片进行合并,可以消除由于删除或者更新造成的空间浪费,对myisam, bdb ,innodb表起作用。具体参考mysql 开发基础系列12 选择合适的数据类型(上)
-- 优化表
OPTIMIZE TABLE city;
总结: analyze, check, OPTIMIZE 执行期间将对表进行锁定,在繁忙时候不要操作。
5. 优化大批量插入数据
5.1 针对大量数据导入到一个非空的myisam表,可以通过以下方式快速导入大量数据。
ALTER TABLE tab_name DISABLE KEYS;
loading the DATA
ALTER TABLE tab_name ENABLE KEYS;
DISABLE KEYS和 ENABLE KEYS是打开或者关闭myisam表非唯一索引的更新,对于myisam空表则默认是先导入数据然后才创建索引,所以不用设置。
5.2 针对innodb表
在导入之前设置unique_checks=0 导完后开启set unique_checks=1。设置autocommit=0 导完后开启autocommit=1。
6. 优化insert 语句
(1) 不同客户插入很多行数据时,更改INSERT INTO为 INSERT DELAYED INTO,这使语句得到更高的速度。
(2) 将索引文件和磁盘文件分在不同磁盘上存放(利用表的选项)。
(3) 如果是批量插入 对myisam表可使用bulk_insert_buffer_size 来提高速度。
(4) 使用load data infile 通常比insert语句快20倍。
7. 优化group by语句
默认情况下 group by 会对字段进行排序(order by),如果想避免排序结果带来的消耗,可以指定order by null 来禁止排序 如下:
-- CityCode 默认使用了排序 (如果CityCode已建索引,默认就排序好了 不用优化)
EXPLAIN SELECT COUNT(country_id), CityCode FROM city GROUP BY CityCode
-- 使用 order by null 来禁止排序
EXPLAIN SELECT COUNT(country_id), CityCode FROM city GROUP BY CityCode ORDER BY NULL
8. 优化order by 语句
mysql 可以使用一个索引来满足order by 子句,而不需要额外的排序(上面group by 就是未键索引 需要再排序),并且order by 的顺序与索引顺序相同,升序或降序。
-- order by 使用到了索引的排序
EXPLAIN SELECT country_id, city_id FROM city GROUP BY country_id,city_id ;
EXPLAIN SELECT country_id, city_id FROM city GROUP BY country_id,city_id ORDER BY country_id,city_id;
EXPLAIN SELECT country_id, city_id FROM city GROUP BY country_id,city_id ORDER BY country_id ASC ,city_id ASC;
EXPLAIN SELECT country_id, city_id FROM city GROUP BY country_id,city_id ORDER BY country_id DESC ,city_id DESC;
-- order by 未使用到索引的排序(一个asc,一个desc)
EXPLAIN SELECT country_id, city_id FROM city GROUP BY country_id,city_id ORDER BY country_id ASC ,city_id DESC;
mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)的更多相关文章
- mysql 开发进阶篇系列 2 SQL优化(explain分析)
接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...
- mysql 开发进阶篇系列 5 SQL 优化(表优化)
一. 使用sql提示 sql 提示(sql hint)是优化数据库的一个重要手段, 是在sql语句中加入一些人为的提示来达到优化操作的目的. 1.1 use index 在查询语句中表名的后面,添加u ...
- mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)
一. 本章介绍mysql中的索引的分类,存储,使用方法的介绍 1. 索引的存储分类 MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件, innodb 存储引擎的表的数据和索 ...
- mysql 开发进阶篇系列 1 SQL优化(show status命令)
一.概述 随着上线后,数据越来越多,很多sql语句开始显露出性能问题,本章介绍在mysql中优化sql语句的方法. 1. 通过show status 命令了解各种sql的执行频率 通过show [ ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)
1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...
随机推荐
- IntelliJ IDEA2017 + tomcat 即改即生效 实现热部署
https://www.cnblogs.com/1024zy/p/6344000.html
- 2019-1-18 Spark 机器学习
2019-1-18 Spark 机器学习 机器学习 模MLib板 预测 //有视频 后续会补充 1547822490122.jpg 1547822525716.jpg 1547822330358.jp ...
- (python)编程小练习
1.将一串字符串反向输出,如将"abcd"变成“dcba” str1="abcd" print str1[::-1] 2.判断是否为回文——判断用户输入的字符串 ...
- jQuery子页面获取父页面元素并绑定事件
父页面HTML文件: <ul id="faul"> <li class="sonli">子页面列表1</li> <li ...
- java中的接口与继承,接口的例子讲解
extends 继承类:implements 实现接口. 简单说: 1.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承, 2.JAVA中不支持多重继 ...
- scrum冲刺
小组第一次冲刺任务及其完成情况描述: 这次主要是先构建一个框架,然后就是完成首页的一些代码编写,能够基本实现首页的注册.登陆以及一些之后完成的内部构建. 在第一次冲刺任务中的收获和体会,以后如何改进的 ...
- CentOS 7 用firewall-cmd来开放端口
2.CentOS 7 用firewall-cmd来开放端口 如: firewall-cmd --permanent --add-port=3306/tcp 重新加载 firewall-cmd --re ...
- 在windows系统安装pygame项目
STEP1: 下载安装程序 访问https://bitbucket.org/pygame/pygame/downloads/,查找与你运行的Python版本匹配的安装程序,如果找不到,可以去https ...
- 更改MySQL/Postgresql密码
Parrot包括几个SQL引擎,但是当它们被预先安装时,默认密码未被配置,并且拒绝访问其root用户. 重新配置Mysql / Mariadb密码 停止MySQL服务. sudo service my ...
- Educational Codeforces Round 25
A 题意:给你一个01的字符串,0是个分界点,0把这个字符串分成(0的个数+1)个部分,分别求出这几部分1的个数.例如110011101 输出2031,100输出100,1001输出101 代码: # ...