mysql的优化措施,从sql优化做起

http://geeksblog.cc/2016/06/11/mysql-optimize/

优化sql的一般步骤

  1. 通过show status了解各种sql的执行频率
  2. 定位执行效率低的sql语句
  3. 通过explain分析效率低的sql
  4. 通过show profile分析sql  ?
  5. 通过trace分析优化器如何选择执行计划
  6. 确定问题,采取措施优化

索引优化措施

  1. mysql中使用索引的典型场景

    1. 匹配全值,条件所有列都在索引中而且是等值匹配
    2. 匹配值的范围查找,字段必须在索引中
    3. 匹配最左前缀,复合索引只会根据最左列进行查找
    4. 仅仅对索引进行查询,即查询的所有字段都在索引上
    5. 匹配列前缀,比如like ‘ABC%’,如果是like ‘%aaa’就不可以
    6. 如果列名是索引,使用column is null会使用索引
  2. 存在索引但不会使用索引的典型场景
    1. 以%开头的like查询不能使用b树索引
    2. 数据类型出现隐式转换不能使用索引
    3. 复合索引,查询条件不符合最左列原则
    4. 用or分割的条件,如果前面的条件有索引,而后面的条件没有索引
  3. 查看索引使用的情况
    1
    show status like ‘Handler_read%‘;

如果Handler_read_rnd_next的值比较高,说明索引不正确或者查询没有使用到索引

有索引:

mysql> select * from dd;
+----+
| a  |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
| 12 |
| 13 |
+----+
13 rows in set (0.00 sec)

mysql> show create table dd;
+-------+----------------------------------------
| Table | Create Table
+-------+----------------------------------------
| dd    | CREATE TABLE `dd` (
  `a` int(11) NOT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------
1 row in set (0.02 sec)
mysql> select * from dd where a=10;
+----+
| a  |
+----+
| 10 |
+----+
1 row in set (0.00 sec)

mysql> show status like ‘Handler_read%‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 0     |
| Handler_read_key      | 1     |    //增加的是这个值
| Handler_read_last     | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 2     |
+-----------------------+-------+
7 rows in set (0.00 sec)
无索引:

mysql> show create table q;
+-------+------------------------------------------------------------------------------------+
| Table | Create Table                                                                       |
+-------+------------------------------------------------------------------------------------+
| q     | CREATE TABLE `q` (
  `a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from q where a=10;
+------+
| a    |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

mysql> show status like ‘Handler_read%‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 1     |
| Handler_read_key      | 1     |
| Handler_read_last     | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 56    |
+-----------------------+-------+
7 rows in set (0.00 sec)

mysql> select * from q where a=11;
+------+
| a    |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

mysql> show status like ‘Handler_read%‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 2     |
| Handler_read_key      | 2     |
| Handler_read_last     | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 70    |
+-----------------------+-------+
7 rows in set (0.01 sec)

简单实用的优化方法

  1. 定期检查表和分析表
    分析表语法:

    1
    analyze table 表名;

检查表语法:

1
check table 表名;
  1. 定期优化表

    • 对于字节大小不固定的字段,数据更新和删除会造成磁盘空间不释放,这时候就行优化表,可以整理磁盘碎片,提高性能
      语法如下:

      1
      optimize table user(表名);
时间: 2024-12-27 22:34:39

mysql的优化措施,从sql优化做起的相关文章

MySQL数据库优化技术之SQL语句慢查询定位

通过show status命令了解各种SQL的执行频率 MySQL客户端连接成功后,通过使用show [session|global] status 命令可以提供服务器状态信息: 其中的session来表示当前的连接的统计结果,global来表示自数据库启动至今的统计结果,默认是session级别的. show status 常用命令: show status like 'com_%'; 其中com_xxx表示xxx语句所执行的次数: 重点注意com_select, com_insert, co

MySQL索引优化分析和SQL优化

1 配置环境的说明 MySQL的版本信息: 系统版本信息: 2 索引的分析 2.1数据准备 2.1.1数据库建表SQL 表的说明: id是自增主键,name是唯一索引,age 是非唯一索引,desc无索引 CREATE TABLE `index_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `name` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT ''

mysql数据库优化 开启慢查询

Mysql数据库优化 一.sql及索引优化 如何发现有问题的sql?使用mysql慢查询日志对有效率问题的sql进行监控 //查看是否开启慢查询日志show variables like 'slow_query_log' set global slow_query_log =on;//开启慢查询 //设置保存慢查询日志路径set global slow_query_log_file = '/var/lib/mysql/slow_log.log'; //记录下没有使用索引的query,show v

MYSQL开发性能研究——批量插入的优化措施

一.我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句. INSERT INTO TBL_TEST (id) VALUES(1);   很显然,在MYSQL中,这样的方式也是可行的.但是当我们需要批量插入数据的时候,这样的语句却会出现性能问题.例如说,如果有需要插入100000条数据,那么就需要有100000条insert语句,每一句都需要提交到关系引擎那里去解析,优化,然后才能够到达存储引擎做真的插入工作. 正是由于性能的瓶颈问题,MYSQL官方文档也就提到了使

mysql数据库性能优化(包括SQL,表结构,索引,缓存)

优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.降低 CPU 计算除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了.order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算).当我们的 IO 优化做到一定阶段之后

MySQL · 性能优化 · MySQL常见SQL错误用法

前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况.阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题.现将<ApsaraDB专家诊断报告>中出现的部分常见SQL问题总结如下,供大家参考. 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如

?二十种实战调优MySQL性能优化的经验

?http://www.searchdatabase.com.cn/showcontent_58391.htm [为查询缓存优化你的查询] 像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的.所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存. [EXPLAIN 你的 SELECT 查询] 使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的. [当只要一行数据时使用 LIMIT 1] 当

MySql数据库3【优化2】sql语句的优化

1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句.在这种情况下,增加一个LIMIT 1会令你的查询更加有效.这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引. 2).不要使用BY RAND()命令 这是一个令很多新手程序员会掉进去的陷阱.你可能不知不觉中制造了一个可怕的平静.这个陷阱在你是用BY RAN

MySQL架构优化实战系列1:数据类型与索引调优全解析

一.数据类型优化 数据类型 整数   数字类型:整数和实数 tinyint(8).smallint(16).mediuint(24).int(32).bigint(64) 数字表示对应最大存储位数,如 tinyint (-127 --- 128),tinyint unsigned 表示不允许负数,则范围为 (0 -- 255). 常规数据库中 int(11) 只是表示控制显示字符的个数是11个,int(1) 和 int(20) 存储和计算是一样的,即 int(1) 照样可以存储1111(4位数)