zoukankan      html  css  js  c++  java
  • mysql基本介绍和优化技巧

    一. mysql框架和基本介绍
    1. 框架图

    更详细:


    2. 存储引擎
    MYISAM与INNODB对比:
    MYISAM:mysql5.1及以前版本的默认存储引擎。支持全文检索,压缩,表级锁等,但不支持事务,行级锁,崩溃后的数据恢复等
    INNODB:mysql5.5及之后的默认存储引擎。支持事务,行级锁,数据恢复,mysql5.6 中的innodb(1.2)支持全文检索。

    如何选择:innodb对于绝大多数的用户都是最佳的选择,除非某些存储引擎能满足特殊需求且使用者很了解这种存储引擎。


    二. 查询性能的方法
    1. 配置文件 my.cnf (linux), 
    读配置文件的一般顺序:
         1)     /etc/my.cnf
         2)      DATADIR/my.cnf
         3)      ~/.my.cnf
    可以通过命令获知:
    mysqld --verbose --help | grep -A 1 'Default options’
    结果:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

    2. 环境变量
    从my,cnf读取环境变量值,
    查看变量值方法: show variables like “”, (不清楚变量名时,用模糊匹配%)
    例如

    设置(全局)变量方法:
    set (global) 变量名=变量值
    例如设置 开启慢查询日志
    set global slow_query_log=1;
    设置后查看变量值
    show variables like "%slow%”;

    | slow_query_log            | ON 

    变量列表:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html

    分析sql语句时一些有用且默认不开启的变量:
    1) 慢查询日志: 开关 slow_query_log, 阈值:long_query_time (单位 秒)
    2) sql剖析工具profile,开关:profiling,历史记录数:profiling_history_size(最大为100)
    3)   记录每条sql语句,开关:general_log, log文件位置:general_log_file
    … …

    3. 查看sql服务状态
    语法 SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr]清除状态 FLUSH STATUS;
    清除表缓存 
    reset query cache ;
    FLUSH TABLE [TABLE NAME]
        
    用法举例
    FLUSH STATUS;
    SELECT ...;
    SHOW SESSION STATUS LIKE 'Handler_read%’;  (SHOW SESSION STATUS LIKE 'Handler_%’;)
    EXPLAIN SELECT …;

    具体参数可以参考:
    http://lxneng.iteye.com/blog/451985
    http://hi.baidu.com/thinkinginlamp/item/8d038333c6b0674a3075a1d3

    4. 查询剖析工具 show profiles
    开启 
    set profiling=1;
    set profiling_history_size=50  最大为100

    用法:
    show profiles;
    show profile; //展示最后一条query时间消耗
    show profile for query ID; // 替换ID值 从show profiles 表里。
    显示更多内容
    show profile cpu,block io for query 4;

    5. 获取查询计划的信息 explain 
    用法 explain  [sql查询语句]
    例如:

    注意每列的含义

    三. 数据类型优化
    1. 选择优化的数据类型原则
         1)尽量使用可以正确存储数据的最小数据类型。例如: 只存0-200,用tinyint unsigned 更好。
         2)选择简单的数据类型。例如整形比字符操作代价更低,存储时间用datetime而不是字符串,用整形存储ip。

    2. 数据类型(主要说整形和字符串)
         1)整型 
    TINYINT 1 字节 (-128,127) (0,255) 小整数值 
    SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值 
    MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值 
    INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 
    BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 

    思考:tinyint(1)和tinyint(2)存储空间相比较?

         2)字符串
    varchar:内容+长度,0-255字节。
    char:长度不足时,空格补足,0-255字节。

    如何选择:
    选择用varchar:字符串的最大长度比平均长度大很多,列更新少。但是一定要估算好长度(排序时)。

    text和blob,大数据类型。

          3)浮点,时间,位 等

    四. 高性能索引
    1. 索引基础
    索引结果为B+树。

    B树:
           

    B-树:


    B+树:


    MYISAM 主索引(辅助索引结构与其相同):

    INNODB 主索引:



    INNODB辅助索引:


    索引优点:
         1) 索引大大减少了服务器需要扫描的数据量;
         2) 索引可以帮助服务器避免排序和临时表;
         3) 索引可以将随机I/O变为顺序I/O。

    2. 高性能索引策略

    1) 独立的列
         将索引单独放到比较符号的一侧,否则无法利用索引。

    2)前缀索引和索引选择性

    3)合适的索引顺序

    4)覆盖索引
    极大的提高性能。

    5)使用索引扫描做排序

    其他策略:
    1)多条件过滤,尽量重复利用索引,(sex,country,age)有索引,现在有查询条件 sex,country,region,age 或者sex,country,region,city,age需要再建索引吗?
    例如:(gender,name)  gender,gender name
    select * from staff where name like “123”;
    select * from staff where gender in (0,1) and name like “123";
    2) 避免多个范围查询
    3)延迟关联
    select *  from table2 order by cnt,id limit 100000,10;

    select *  from table2 join (select id from table2 order by cnt limit 100000,10) as x using(id) ;

    五. 查询性能优化
    1) 查询执行的基础

    2) 查询优化器的局限性
    union限制
    (select first_name,last_name from actor order by last_name) union (select first_name,last_name from customer order by last_name) order by last_name limit 20;

    (select first_name,last_name from actor order by last_name limit 20) union (select first_name,last_name  from customer order by last_name limit 20) order by last_name limit 20 ;

    在同一个表上查询和更新
    update foo as outer set cnt= (select count(*) from foo as inner where inner.type=outer.type);

    update foo join (select type,count(*) as cnt from foo group by type) as der using(type) set foo.cnt=der.cnt;

    3)优化特定关联查询
    优化关联:
    explain select * from film inner join (film_actor,actor) on (film.film_id = film_actor.film_id and film_actor.actor_id = actor.actor_id); explain select straight_join * from film inner join (film_actor,actor) on (film.film_id = film_actor.film_id and film_actor.actor_id = actor.actor_id);

    优化limit
    优化sql_calc_found_rows
     select sql_calc_found_rows *  from table2 order by cnt,id limit 100000,10;
     select found_rows();

    selelt count(*) from table ..

  • 相关阅读:
    【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
    【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】
    【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
    IMemoryBufferReference and IMemoryBufferByteAccess
    SoftwareBitmap and BitmapEncoder in Windows.Graphics.Imaging Namespace
    Windows UPnP APIs
    编译Android技术总结
    Windows函数转发器
    Two Ways in Delphi to Get IP Address on Android
    Delphi Call getifaddrs and freeifaddrs on Android
  • 原文地址:https://www.cnblogs.com/yunlong/p/3901383.html
Copyright © 2011-2022 走看看