码迷,mamicode.com
首页 > 数据库 > 详细

MySQL语句优化

时间:2015-07-16 00:26:28      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

一、优化SQL的一般步骤

  a)通过SHOW STATUS;命令了解各种SQL的执行频率
    SHOW [SESSION|GLOBAL] STATUS;
    SESSION (默认)表示当前连接
    GLOBAL 表示自数据库启动至今
    SHOW GLOBAL STATUS LIKE ‘com_%‘

  b)查看本次登录以来增删改查的次数
    SHOW STATUS LIKE ‘com_select%‘
    SHOW STATUS LIKE ‘com_update%‘
    SHOW STATUS LIKE ‘com_insert%‘
    SHOW STATUS LIKE ‘com_delete%‘

  c)针对innodb的增删改查
    SHOW STATUS LIKE ‘innodb_rows%‘

  d)服务器已经工作的秒数
    SHOW STATUS LIKE ‘uptime%‘

  e)慢查询

    查看是否开启了慢查询
      SHOW VARIABLES LIKE ‘%slow%‘ (slow_query_log表示开启或关闭)
    查看慢查询的时间定义
      SHOW VARIABLES LIKE ‘%long%‘
    查看慢查询的次数
      SHOW STATUS LIKE ‘slow_queries‘
    慢查询日志中会记录慢查询的SQL
    分析运行慢的SQL
      EXPLAIN SQL
      DESC SQL
      +----+-------------+-------+------+---------------+------+---------+------+------+-------+
      | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
      +----+-------------+-------+------+---------------+------+---------+------+------+-------+
      | 1 | SIMPLE | book | ALL | NULL | NULL | NULL | NULL | 3 | |
      +----+-------------+-------+------+---------------+------+---------+------+------+-------+
      select_type:查询类型
        ALL:本次是简单的单表查询
        PRIMARY:本次查询用到了主键
        UNION:多表查询
      type:
        ALL:通过全表扫描得到的数据
        possible_keys:可能用到的索引
        key:本次用到的索引
        rows:扫描的行数,这里越小查询效率越高
        Extra:执行情况的说明和描述

二、索引问题

  a)MyISAM存储引擎的表数据和索引是分开的,各自是独一的一个文件。InnoDB存储引擎的数据和索引存储在同一个表空间里,但可以有多个文件组成。

  可以对列的某一部分进行索引:

    CREATE INDEX index_name ON table_name(column(4))

  b)哪些字段适合加索引

    where条件、group by条件 having条件 order by条件

  c)索引会被使用的情况

    对于多列索引,查询条件中用到了最左边的列,索引一般会被使用

    CREATE INDEX index_name ON table_name(company_id,moneys);

    WHERE company_id=123 会使用索引

    WHERE moneys=22 不会使用索引

  如果OR前的条件中的列有索引,后面的列没有索引,那么涉及的索引都不会被用到。只有or前后的字段都加了索引,查询才可能用到索引

  如果列类型是字符串,但是把数字当作条件,索引不会被用到

  handler_read_rnd_next的值越高,则意味着查询效率越低,并应该建立索引补救。SHOW STATUS LIKE ‘handler_read%‘

三、表优化

  CHECK TABLE table_name; 分析表是否有错误,例如表被删除后,依赖他的视图将无效

  OPTIMIZE TABLE table_name; 如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了多次改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,对MyISAM InnoDB有效

四、常用SQL的优化 

  当数据量比较大的时候,导入导出表会比较耗费系统资源,应该使用 infile和outfile
  ? load data 查看帮助
  LOAD DATA INFILE ‘data.txt‘ INTO TABLE db2.my_table 快速导入
  示例:load data infile ‘e:/sql.txt‘ into table book(bookname,publisher,author,price,ptime,pic,detail);

  如果有索引的话,可以先关闭索引,在导入数据,然后打开索引 这样导入会更快DISABLE KEYS/ENABLE KEYS 关闭打开表的非唯一索引,对InnoDB无效
  ALTER TABLE table_name DISABLE KEYS
  导入数据
  ALTER TABLE table_name ENABLE KEYS

  关闭唯一索引以提高导入效率(前提是要确保数据不重复)
  SET UNIQUE_CHECKS=0 关闭唯一校验
  SET UNIQUE_CHECKS=1 打开唯一校验

  针对innodb表可以关闭自动提交以提高导入效率(因为每导入一行都要校验是否提交)
  SET AUTOCOMMIT=0 关闭自动提交
  SET AUTOCOMMIT=0 打开自动提交

  ? outfile

  SELECT * FROM table_name INTO OUTFILE ‘file_name‘ 快速导出

  group by分组后默认根据分组列升序排列,如果不想排序可以使用 order by null禁止排序

  尽量避免使用子查询,用连接查询来代替,因为子查询不会用到索引

 

MySQL语句优化

标签:

原文地址:http://www.cnblogs.com/houwentoa/p/4649687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!