大批量插入数据优化
1、对应Myisam类型的表,可以通过以下方式快速的导入大量数据

alter table tablname DISABLE KEYS;
loading the data
alter table tablname enable keys;

这两个命令用来打开或者关闭Myisam表非唯一索引的更新。
2、对于InnoDB类型的表,这种方式并不能提高导入的效率,我们可以采取下面几种策略:
(1)、因为InnoDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率。如果InnoDB表没有主键,那么系统会默认创建一个内部列作为主键,所以,如果可以给表创建一个主键,就可以利用这个优势提高导入数据的效率。
(2)、在导入数据前执行set unique_checkes = 0,关闭唯一性校验,在导入结束后执行set unique_checks = 1,恢复唯一性校验,可以提高导入的效率
(3)、如果应用使用自动提交的方式,建议在导入前执行set autocommit = 0,导入结束收再执行set autocommit = 1,也可以提高导入效率
优化group by语句
默认情况下,Mysql排序所有group by col1,col2,…的字段。查询的方法如同在查询中指定order by col1,col2,….。如果显示的包括一个包含相同的列order by 子句,Mysql可以毫不减速的对他进行优化,尽管仍然进行排序。
如果查询包括group by但你还想要避免排序结果的消耗,你可以指定order by null禁止排序,例如:

select a,count(*) form bar group by a order by null;

优化order by语句
在某些情况下,Mysql可以使用一个索引来满足order by子句,而不需要额外的排序,where条件和order by使用相同的索引,并且order by的顺序和索引顺序相同,并且order by的字段都是升序或者都是降序。
例如:下列sql可以使用索引

select * from t1 order by key_part1,key_part2,....;
select * from t1 where key_part1 = 1 order by key_part1 desc,key_part2 desc;
select * from t1 order by key_part1 desc,key_part2 desc;

以下情况不适用索引

select * from t1 order by key_part1 desc,key_part2 asc; -- 排序混合
select * from t1 where key2 = constant order by key1; -- 用于查询行的关键字和order by中所使用的不同
select * from t1 order by key1,key2;-- 一对不同的关键字使用order by

优化join语句
假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:
select * from customerinfo where customer_id not in (select customer_id from salesinfo);
如果使用join来完成,速度将会快很多。尤其是salesinfo表中对customer_id建有索引的话,性能将会更好,查询如下:

select * from customerinfo left join salesinfo on customerinfo.customer_id = salesinfo.customer_id where salesinfo.customer_id is null;

join的效率更高是因为Mysql不需要再内存中创建临时表来完成这个逻辑上需要两步骤的查询工作。
优化or条件
对于or子句,如果要利用索引,则or之间的每一个条件都必须用到索引
查询优先还是更新(insert,update,delete)优先
我们首先应该确定应用的类型,判断应用是以查询为主,还是以更新为主,下面我们提到的改变调度策略的方法主要指针对Myisam存储引擎,对于InnoDB存储引擎,语句的执行时由获得行锁的顺序决定的。
Mysql的默认调度策略总结如下:
1、写入操作优先于读取操作
2、对某张表的写入操作某一时刻只能发生一次,写入请求按照他们到来的次序来处理
3、对某张表的多个读取操作可以同时进行,Mysql提供了几个语句调节符,允许你修改他的调度策略
(1)、low_priority关键字应用于delete、insert、load data、replace和update
(2)、high_priority关键字应用于select和insert语句
(3)、delayed关键字应用于insert和replace语句
优化表的数据类型
我们可以使用procedure analyse()对当前已有用用的表类型的判断,该函数可以对数据表中的列的数据类型提出优化建议,可以根据应用的实际情况酌情考虑是否实施优化。
语法:

select * from tbl_name procedure analyse();
select * from tbl_name procedure analyse(16,256);

输出的每一列信息都会对数据表中的列的数据类型提出优化建议。第二个例子告诉procedure analyse()不要为那些包含的值多于16个或者256字节的enum类型提出建议,如果没有这个限制,输出信息可能很长,enum定义通常很难阅读。
通过拆分,提高表的访问效率
这里所说的拆分主要针对Myisam类型的表,拆分的方法分为两种情况:
1、纵向拆分
按照应用访问的频度,将表中经常访问的字段和不经常访问的字段拆分成两个表,经常访问的字段尽量是定长的,这样可以有效的提高表的查询和更新效率
2、横向拆分
按照应用的情况,有目的的将数据横向拆分成几个表或者通过分区分到多个分区中,这样可以有效的避免Myisam表的读取和更新导致锁的问题。
使用冗余统计表 使用create temporary table语句,他是基于session的表,表的数据保存在内存里面,当session断掉后,表自然消除 对于大表的统计分析,如果统计的表数据列不大,利用insert…select 将数据迁移到临时表比直接在大表上统计效率更高。

来源:http://www.voidcn.com/article/p-zgmyllre-bhe.html

深入浅出Mysql(四)相关推荐

  1. 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一第 1 章  MySQL的安装与配置...

    第 1 章 MySQL的安装与配置 深入浅出MySQL:数据库开发.优化与管理维护(第2版) 近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应 ...

  2. 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用

    mysql四种索引PRIMARY(主键索引).INDEX(一般索引).UNIQUE(非空索引).FULLTEXT(全文索引)应用 目录 1)PRIMARY: 2)NORMAL: 3)UNIQUE: 4 ...

  3. 深入浅出MySQL事务处理和锁机制

    深入浅出MySQL事务处理和锁机制 2015-01-13 架构师之旅 1. 事务处理和并发性 1.1. 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置 ...

  4. 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一1.2 MySQL的安装...

    本节书摘来自异步社区出版社<深入浅出MySQL:数据库开发.优化与管理维护(第2版)>一书中的第1章,第1.2节,作者: 唐汉明 , 翟振兴 , 关宝军 , 王洪权 , 黄潇,更多章节内容 ...

  5. 深入浅出MySQL出版了

    经过近一年的写作,我们的新书,也是大家的第一本书<<深入浅出MySQL>>终于出版了,近期已经在全国上市,下面是图示的封面: 还有程序员杂志做的宣传: 从china-pub前两 ...

  6. 读《深入浅出MySQL数据库开发、优化与管理维护(第2版)》笔记2 WITH ROLLUP关键字

    读<深入浅出MySQL数据库开发.优化与管理维护(第2版)>笔记2 WITH ROLLUP关键字 WITH ROLLUP是可选语法,表名是否对分类聚合后的结果进行再汇总; 我自己的使用实例 ...

  7. [深入浅出]MySQL安全规范

    [深入浅出]MySQL安全规范 一.Mysql服务器安全规范 1. 禁止应用直连DB,一般通过代理访问. 2. 禁止DB公网访问. 3. 禁止生产和办公互通,需生产环境和办公环境隔离. 4. Linu ...

  8. 深入浅出Mysql - 优化篇(锁)

    深入浅出Mysql - 优化篇(锁) 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保 ...

  9. 别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官!

    别看是面试问烂的题目,一面试你照样还是不会系列MySQL四种隔离级别,看完吊打面试官! 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也 ...

  10. 深入浅出Mysql - 基础篇(列类型/运算符/函数)

    深入浅出Mysql - 基础篇(列类型/运算符/函数) 每一个常量.变量和参数都有数据类型,它用来指定一定的存储格式.约束和有效范围.MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时 ...

最新文章

  1. R语言指数分布(exponential distribution)函数(dexp, pexp, qexp rexp)实战
  2. C\S B\S 结果,其实就是这个样子的。
  3. Log4j输出格式控制
  4. python学习笔记(生成xml)
  5. DeepLearning:环境配置(cuda+cudnn)
  6. 还在用 Notepad++吗? 盘点五款更好用的文本编辑器
  7. 使用SIFT匹配金馆长表情包
  8. Crontab中文表达式解析
  9. 天津铁路警方打击倒票专项行动破案19起 抓获19人
  10. 数学建模题目和模型汇总(2000-2019 国赛本科组)
  11. 论文绘图——矢量图篇
  12. 微慕WordPress小程序专业版v2.0
  13. 英语拾遗之基本的量词
  14. 去国企1年后,我后悔了!重回大厂内卷
  15. 流程图、数据关系绘图神器yEd
  16. BUUCTF WEB PIAPIAPIA1
  17. 王立柱《c语言》3.5.4
  18. 计算机网络基础之表示层的功能和服务
  19. 数据库系统概念笔记-关系模型介绍
  20. pdf阅读器_适用于Windows的最佳PDF阅读器

热门文章

  1. sublime67linter-php,Sublime Text 3 搭建 React.js 开发环境
  2. python标准算术操作符有哪些_在python中的算术操作符
  3. HIVE的安装配置、mysql的安装、hive创建表、创建分区、修改表等内容、hive beeline使用、HIVE的四种数据导入方式、使用Java代码执行hive的sql命令
  4. WebServices应用集成框架ESB(Enterprise Service Bus 企业服务总线)
  5. 线性代数之矩阵逆的微分
  6. 南昌大学计算机系分数,南昌大学2016年分省分专业录取分数线
  7. FPGA边沿检测Verilog实现(包含上升沿,下降沿,双边沿)
  8. 如何绘制caffe网络训练曲线
  9. VS2010生成静态库(.lib)
  10. python装饰器简单理解的小demo