MySQL语句优化

一、优化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禁止排序

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

时间: 2024-12-18 12:11:33

MySQL语句优化的相关文章

mysql语句优化总结(一)

Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM

mysql语句优化方案(网上流传)

关于mysql处理百万级以上的数据时如何提高其查询速度的方法 最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍.曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂.因此如何提高sql语句查询效率,显得十分重要.以下是网上

9 MySQL语句优化的原则

1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:  a.有大量重复值.且经常有范围查询( > ,< ,> =,< =)和order by.group by发生的列,可考虑建立群集索引:  b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引:  c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.索引虽有助于提高性

mysql 语句优化一列

优化前语句: SELECT ifnull(s.mileage, -1) as mile, s.fuel_hkm as val, t.fhkm_rank as rank, ifnull((select u.photo from app_user u where u.user_id = t.user_id  limit 1),'') as path, case when s.car_id = '***********' then 0 else 1 end as self, ifnull(( SELE

MySQL语句优化的原则

1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说: a.有大量重复值.且经常有范围查询( > ,< ,> =,< =)和order by.group by发生的列,可考虑建立群集索引: b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引: c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.索引虽有助于提高性能但不

MySQL语句优化方法(简单版)

基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为workbench,数据库服务器则是安装在本地的mysql数据库. 为什么要优化sql语句? 加快运行速度 减少数据库资源开销 在企业级数据库中sql优化是必备技能. 基础优化技能: 在查询语句中尽量减少查询语句返回结果,尤其是 SELECT*FROMXXX 来返回全部数据.只选择必要的数据,作为返

mysql语句优化技巧

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=03.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引

mysql 语句优化心得

排序导致性能较慢 优化策略:1.尽量不使用排序 2.只查有索引的结果然后 内连接查询 select  bizchance0_.*  from biz_chance bizchance0_, biz_bizcustomer bizbizcust1_ where bizchance0_.uuid=bizbizcust1_.recordinfoid and bizchance0_.ispublic=1          order by bizchance0_.orderkey desc limit

Mysql语句优化小技巧

在使用group by 分组查询是,默认分组后,还会排序(Using filesort),可能会降低速度. 解决办法:加上order by null 不让它排序 select * from emp group by empno order by null; 有些情况下,可以使用连接来替代子查询.因为使用join,MySQL不需要在内存中创建临时表 select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式] select * fro