由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里

以下的测试数据根据环境的不同所耗费的时间有所不同,例如我在腾讯云上的测试,以及在本机的测试速度相差三倍。但当环境因素一样的时候,优化sql能够带来显著的提升。

测试表数据:3百万条数据,12个字段,存储引擎:myisam

1 确定搜索一条记录的时候,加上limit 1 ,以此让游标查到第一条结果时停止,不需要遍历下面的结果

使用这样子数据递增的varchar字段,在最优情况下,结果在第一条:

SQL : select * from tbl_game_user_test where channel= 'jieduan1';

TIME : 1.292 s

而当我们加上了limit 1 :

SQL : select * from tbl_game_user_test where channel= 'jieduan1' limit ;

TIME : 0.0001 s 

对比上面,提高了很多。而在最坏情况下,结果在最后一条,那么两者使用时间是一致的。

而当我们explain的时候,两者是一致的:

+----+-------------+--------------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+------+---------------+------+---------+------+---------+-------------+
| | SIMPLE | tbl_game_user_test | ALL | NULL | NULL | NULL | NULL | | Using where |
+----+-------------+--------------------+------+---------------+------+---------+------+---------+-------------+

2 like查询以%开头索引会失效,没有命中索引,查询效率差别是很大的。而%在结尾,可以命中索引

未优化的sql:

SQL:select * from tbl_game_user_test where deviceID LIKE '%deviceID1111111'

TIME : 2.342 s

而当我们将%放到末尾:

SQL : select * from tbl_game_user_test where deviceID LIKE 'deviceID1111111%';

TIME : 0.001 s

花费的时间相差挺大

3 对于分页的优化,可以采用覆盖索引的原理来优化。

在数据量不大的时候,limit 分页效率差别不大,当数据量大的时候,数据越大,效率差距越大,因此我们可以采用覆盖索引的原理,来优化sql。

未优化前SQL:

SELECT * FROM tbl_game_user_test ORDER BY id LIMIT ,

Times : 4.55 s

而优化的SQL:

select * from tbl_game_user_test JOIN (SELECT id FROM tbl_game_user_test ORDER BY id LIMIT ,)a USING(id)

Times : .014s

我们把第二种检索方法叫做延迟关联,因为延迟了对列的访问。在查询的第一阶段MySQL可以使用覆盖索引,在FROM字句的查询中找到匹配的id,然后根据这些id值在外层查询匹配获取需要的列值

上述的语句,我们也可以这么写:

select * from tbl_game_user_test where id >=(SELECT id FROM tbl_game_user_test ORDER BY id LIMIT ,) ORDER BY id limit 

4 永远为每张表设置一个ID

  我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的 AUTO_INCREMENT标志。
就算是你 users 表有一个主键叫 “email”的字段,你也别让它成为主键。使用 VARCHAR 类型来当主键会使用得性能下降。另外,在你的程序中,你应该使用表的ID来构造你的数据结构。
而且,在MySQL数据引擎下,还有一些操作需要使用主键,在这些情况下,主键的性能和设置变得非常重要,比如,集群,分区……

5 合适的存储引擎

  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

同样的情况下,执行相同的查询,myisam 比innodb 快接近4倍;

存储引擎 : myisam

SQL :select * from tbl_game_user_test where channel = 'jieduan65';

time : 1.2 s

而 : innodb 是 4.6s  【平均】

6 Mysql SQL Mode 可以禁止截断保存操作

当我们对一个varchar(3)的字段进行更新操作:

update tbl_game_user_test set platform  = 'jieduanTest' where id = ;

我们发现插入的字符被自动截断了,

存入的是:

jie

出现这种情况往往会发生一些意料之外的事情,等到发生了,再来找问题,再扩大字段长度就比较晚。我们可以在长度超过限制就报错,通过报错来提前报警。

可以通过:

set session sql_mode='STRICT_TRANS_TABLES'

就会提示:

[Err]  - Data too long for column 'platform' at row 

7 负向条件查询不能使用索引

select * from order where status!= and stauts!=

not in/not exists都不是好习惯

可以优化为in查询:

select * from order where status in(,)

8 优化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= 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;
--order by 的字段混合ASC 和DESC
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
--用于查询行的关键字与ORDER BY 中所使用的不相同
SELECT * FROM t1 ORDER BY key1, key2;
--对不同的关键字使用ORDER BY:

 其他优化小技巧:

1 字符字段只建前缀索引

2 导入大数据量时,先删除索引,导入数据,再创建索引

3 在设计表的时候,可以按照定长字段与变长字段相分离,分开两个表存放。例如论坛标题是我们经常获取的,而论坛个人创建时间等,几乎是不会去看,这种我们可以放于几乎不查的表中。同时,我们也可以把较长内容的字段独立存放于一个表中。

4 冗余字段。很多时候我们设计表都要遵守第一,二,三范式,但有时我们为了加快查询,而应该添加冗余字段。例如论坛栏目表中,一般而言,我们会有个栏目表,有文章表,而当我们获取该栏目有多少篇文章的时候,联表查询显得稍费时间,而我们可以在栏目表添加一个文章数量字段,每次添加或者删除都更新一下该字段。

Mysql 优化与测试的更多相关文章

  1. mysql 优化之 is null ,is not null 索引使用测试

    关于mysql优化部分,有很多网友说尽量避免使用is null, is not null,select * 等,会导致索引失效,性能降低?那是否一定收到影响呢?真的就不会使用索引了吗? 本文的测试数据 ...

  2. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  3. 0104探究MySQL优化器对索引和JOIN顺序的选择

    转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...

  4. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  5. [转] MySql 优化 大数据优化

    一.我们可以且应该优化什么? 硬件 操作系统/软件库 SQL服务器(设置和查询) 应用编程接口(API) 应用程序 ------------------------------------------ ...

  6. 单表60亿记录等大数据场景的MySQL优化和运维之道

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  7. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  8. (转)MySQL优化实例

    在Apache, PHP,MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时 ...

  9. 微博MySQL优化之路--dockone微信群分享

    微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...

随机推荐

  1. Nginx 图片服务器搭建

    安装Nginx >yum install -y nginx 安装vsftpd  http://www.cnblogs.com/eason-d/p/9057389.html 2: 创建目录 /us ...

  2. c++经典排序算法全集(转)

    C++排序算法全集 排序算法是一种基本并且常用的算法.由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高. 一.简单排序算法 由于程序比较简单,所以没有加什么注释.所有的程序都给出了完 ...

  3. 一步一步学习Android开发

    一步步踏入Android的阵营. 疑惑篇: gravity和layout_gravity的区别

  4. Wrapper模式(Decorator模式)

    [Wrapper模式(Decorator模式)] 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 意图: 动态地 ...

  5. Putty建立隧道的方法[z]

    通过上节我们了解了SSH隧道的优点,但是无论是现实中还是网络中,隧道都是有入口和出口的,本节就以Putty隧道为例,详细介绍Putty建立隧道的方法. 模拟案例一: 端口,出口为2012端口,隧道建立 ...

  6. Cook-Torrence Illumination Model 的一些数学说明

    Cook-Torrence 光照模型如下: 这个Io就是计算后最终的光强,主要是用来计算镜面反射光,漫反射和环境光的计算和Phong模型一致. F:Fresnel反射系数.主要用来说明反射光强度占入射 ...

  7. mysql新建用户并授权

      参考:https://www.cnblogs.com/zhangdiIT/p/8116776.html

  8. C++11中std::unordered_map的使用

    unordered map is an associative container that contains key-value pairs with unique keys. Search, in ...

  9. Android的/system/lib里加入自己的so库

    执行下命令: 1 重新挂载/system目录,使之能读写:mount -o remount,rw /dev/null /system 2 修改这个文件的权限:chmod 777 /system 3 利 ...

  10. swift学习之UITabelView ----使用xib定义cell

    // //  TwoViewController.swift //  tab // //  Created by su on 15/12/7. //  Copyright © 2015年 tian. ...