那些可能被你忽略的MySQL优化技巧
说明:本文中的内容适用于MySQL5.1-5.6版本,不保证新的版本中仍然适用; 且只针对于大部分常见应用场景,是否有效果应以基于实际业务数据的测试为准。
1 优先把列设置为NOT NULL
允许NULL的列不仅占用更多磁盘空间,而且会影响查询分析器对SQL语句的优化,在业务场景允许的情况下应优先设置列为NOT NULL,并赋予默认值如空白字符串、-1等。
2 使用整型代替浮点数类型
DEMICAL有很高的精度,但是计算效率和占用空间上都差于FLOAT、DOUBLE,但是后者不适用于精度非常高的数据。兼顾效率和精度可以把浮点数转换为整型,例如对要求精确到小数点后7位的数据乘以1000000,显示时再通过应用程序做转换。
3 优先把索引设置为唯一
如果已知一个列的内容不会出现重复的行且有必要建立索引,则应建立唯一索引,除了防止误操作,还可以明确的告知查询分析器,某些查询只要找到一条符合条件的记录就可以结束扫描了。
4 使用哈希索引
如果在一个很长的字符串列上做精确查找,直接建立索引可能不是最好的办法,这会导致占用更多磁盘空间和索引效率的降低,例如这个查询
select url from myurls where url='http://blog.csdn.net/autfish/article/details/51660864';
可以考虑从应用层面上优化,对myurls表增加一个int列hashurl,在插入记录时通过一定哈希算法计算url的哈希值,记入hashurl列,并对该列建立索引
查询语句修改为:
select url from myurls where hashurl=3346369 and url='http://blog.csdn.net/autfish/article/details/51660864';
通过hashurl的索引会过滤掉大部分不符合条件的行数,后面的精确匹配解决了哈希冲突问题。
5 使用前缀索引
对于上面这个问题(在很长的字符串列上建索引),另一个优化选择是只对开头的部分字符建立索引,例如:
alter table myurls add key(url(10));
当然,这个做法对本例是不适合的,因为网址大多数都以http开头,这个索引的大部分内容都起不到过滤的作用。
高性能MySQL书中介绍了一个确定索引字符数的办法,先对列完整内容做group by统计各值分布情况,然后取前n个字符做group by操作,并逐渐增多字符数,直到各值分布的数字与完整内容分布数字接近。
6 反序存储字符串
某些业务场景会频繁以通配符%开头的值做查询条件,例如查询所有qq邮箱用户:
select * ffrom emails where email like '%qq.com'
我们知道这样的查询索引是不起作用的,这时仍然可以在应用层面上解决,对字符串进行反序,例如123@qq.com转换为moc.qq@321,查询语句修改为
select * from emails where email like 'moc.qq@%';
7 使用ENUM类型
例如
create table mytable
(id int not null auto_increment,
sex enum('m','f') not null default 'm',
primary key(id)
);
优点是可读性好,(相对于字符串类型)占用空间小
8 把字符串类型转换为整型
某些特殊类型的字符串可以转换为整型存储,常见的有IP和十六进制数形式的字符串,典型的应用是MD5码。
转换IP:
select inet_aton('192.168.0.1');
select inet_ntoa(3232235521);
转换十六进制数:
select hex('a0b1');
select unhex(61306231);
9 使用延迟关联
理解延迟关联的前提是理解覆盖索引,覆盖索引指select的所有列都可以直接在索引中取得,例如:
select name,sex,birthday from users where birthday>'2000-01-01';
如果正好有一个索引是index(name,sex,birthday),那么执行查询时不需要返回表存储空间读取数据,通常称为覆盖索引,效率非常高。
但是很多时候没有这样的好事,业务上可能需要取出全部字段的十之八九,或者为了方法复用直接select *,这时候可以尝试使用延迟关联:
select * from mytable join(select id from mytable where ...) as t1 on(t1.id=mytable.id)
这是利用了InnoDB的非聚簇索引包含主键的特性对执行计划的一部分使用了索引覆盖,当然,是否能提高执行效率还要看具体业务,不能一概而论。
10 使用explain获得近似值
在海量数据且要做分页的场景中,有时候为了速度会选择用近似值代替完全精确的总数。如何取得近似值呢,用explain命令估算的rows是一个不错的方案。执行explain并不需要真正的执行查询,成本很低。
在总数是近似值时,如何确定是否显示"下一页"按钮呢?我们可以每次在读取下一页内容时都比需要的行数多读一行,例如每页显示20条,每次读取新页内容时读取21条,如果第21条存在则显示下一页,如果不存在(或少于20条)则不显示。
那些可能被你忽略的MySQL优化技巧的更多相关文章
- MySQL优化技巧总结
MySQL优化的几个大方向 ① 硬件优化 ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整 ③ SQL语句方面的优化 ④ 表方面的优化 硬件优化 cpu,内存, ...
- 日常工作中常见的mysql优化技巧
1.介绍一下MYSQL经常使用的优化技巧. MySQL 自带 slow log 的分析工具 mysqldumpslow ,可是没有说明.本文通过分析该脚本,介绍了其用法. slow log 是 MyS ...
- MySQL优化技巧之五(mysql查询性能优化)
对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐 ...
- MySQL优化技巧
目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...
- 项目中常用的19条MySQL优化技巧
原文:https://segmentfault.com/a/1190000012155267 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 一.EXPLAIN 做My ...
- MySQL优化技巧【持续更新】
前言 应用程序或web网页有时慢的像蜗牛爬似的,可能是网络原因,可能是系统架构原因,还有可能是数据库原因.那么如何提高数据库SQL语句执行速度呢?下面是积累的一些优化技巧,望对君有用. 正文 1.比较 ...
- mysql优化技巧《转》
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- MySQL优化技巧之三(索引操作和查询优化)
对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能 ...
- Linux上跑MySQL优化技巧
1.禁止操作系统更新文件的atime属性 atime是Linux/UNIX系统下的一个文件属性,每当读取文件时,操作系统都会将读操作时间回写到磁盘上.对于读写频繁的数据库文件来说,记录文件的访问时间一 ...
随机推荐
- 【MySQL】悲观锁&乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- Hadoop总结篇之二--yarn的概况
在弄清楚yarn是什么之前,先来看一下MRv1. 它的由编程模型+数据处理引擎(map/reduceTask)+运行时环境组成(JobTracker/TaskTracker).其中JobTracker ...
- Python的第六天
常用模块的学习 一.time & datetime模块 时间相关的操作,时间有三种表示方式: 时间戳 1970年1月1日之后的秒,即:time.time() 格式化 ...
- 3.3 哈尔小波空间W0
在3.2节我们学习了关于(3.8)定义的Vj的性质.特别的,我们可以乘以系数从一个Vj空间变换到另一个.我们这节学习V0和V1的关系. 将f1(t)∈V1投影至V0 我们考虑一个属于V1的函数f1(t ...
- ASP.NET中控件命名规则
控件名 简写 控件名 简写 Web 窗体 Label lbl TextBox tb Button btn LinkButton lb HyperLink hl Repeator rpt ImageBu ...
- git学习:多人协作,标签管理
多人协作: 查看远程库的信息, git remote 推送分支到远程库 git push origin master/dev 注意:master是主分支,时刻需要与远程同步 dev是开发分支,也需要与 ...
- [Mongodb] Relica Set复制集集群简单搭建--持续更新
这里我们搭建一个没有访问控制,奇数个Set没有仲裁者的集群 1.三个配置文件添加 replication.replSetName:"Replica_test" 并启动三个实例2.连 ...
- Python基础篇【第6篇】: Python装饰器
装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...
- 用svg制作loading动画
首先说明:由于各浏览器对svg动画事件支持不统一,此loading动画在Firefox,Opera,Chrome中均没有问题,IE和Safari中有问题,可能是不支持SIML写动画的语法, 但是用Ca ...
- 转(Response.WriteFile 无法下载大文件解决方法)
以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ...