转自http://www.cnblogs.com/112ba/p/6220650.html

数据类型

简单原则:更小更好,简单就好,避免NULL
1)整型如int(10)括号中的值与存储大小无关
2)实数decimal比float与double占用更大存储空间且CPU不能直接对decimal进行计算
3)字符串列最大长度<=255varchar使用一字节保存长度,否则使用2字节。char(10)括号中是字符数,而不是字节数(字节数与列字符集相关)。
4)使用MYSQL的内建类型保存日期与时间,如datetime、timestamp

索引类型

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

1) B-Tree索引
MyISAM、InnoDB使用B+Tree作为索引结构
MyISAM与InnoDB在实现上有所不同:MyISAM的主键与普通索引使用的结构一致,叶子节点保存了指向数据记录的地址。

InnoDB的主键采用聚集索引的方式(叶子节点
保存完整的行数据),而普通索引则与MyISAM
相似,但是叶子节点保存的是主键的值。

NDB Cluster内部实际使用T-Tree结构实现索引

MYSQL中能使用B-Tree索引的查询类型:
create table people (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum(‘m’,'f’) not null,
key (last_name,first_name,don)
) engine=myisam;
1. 匹配全名
where last_nam=’a’ and first_name=’b’ and dob=’1990-01-01′
2. 匹配最左前缀
where last_name=’a’ 或 where last_name=’a’ and first_name=’b’
3. 匹配列前缀
where last_name like ‘a%’
4. 匹配范围值
where last_name >= ‘a’ and last_name<=’d’
5.精确匹配一部分并且匹配某个范围中另一部分
where last_name=’a’ and first_name like ‘k%’
6. 只访问索引的查询
B-Tree支持只访问索引的查询,不访问数据行(覆盖
索引)
select first_name from people where last_name=’a’

MYSQL中B-Tree索引的一些局限:

1. 查询不是最左前缀开始不能使用索引
where first_name=’a'或where last_name like ‘%a’
2. 不能跳过索引中的列
where last_name=’a’ and dob=’1990-01-01′将只会所使用索引的第一列
3. 第一个范围条件右边的列不能使用索引
where last_name=’a’ and first_name like ‘a%’ and dob=’1990-01-01′ 因为like是范围查询,所以只会使用索引的前两列

2) Hash索引

Hash索引是建立在hash表基础上的,只对使用了索
引中每一列的精确查询有用(Memory和NDB支持,
InnoBD支持自适应hash索引)

Hash查询很快,但有些局限:
1. 索引中只保存hash码与行指针,不能覆盖索引
2. 不能使用hash索引排序
3. 不支持部分索引列匹配
4. 只支持’=',’IN’,'<=>’相等比较查询,范围查询不能使用Hash索引
5.如果hash算法的碰撞率很高会影响索引性能
6. 碰撞率很高的Hash索引删除行代价很高

查询优化

1. 隔离列
隔离列意味着条件中的列不是表达式也不位于函数中
2. 前缀索引和索引选择性
索引选择性=不重复索引值/表中所有行,越大越好
前缀索引:对于char、varchar、blob、text类型可以
索引开始的几个字符,通过索引选择性确定索引几个
字符
KEY `bc` (`b`,`c`(5))
KEY `cd` (`c`(5),`d`(5))

3. 为排序使用索引

order by子句的顺序与索引中列顺序完全一致,并且所有列排序方向一样才可以使用索引排序。如果联接多表,只有order by子句中所有列引用的是第一个表才可以(查询优化器重写查询后)。

order by子句也要遵循索引最左前缀原则(前导列在where中精确匹配除外)。

例:

key t1 (day,in_id,con_id) 如下查询可以使用索引(explain的Extra中不会看到using filesort)

4. group by使用索引

group by 使用索引规则与order by一致。

group by 默认会进行排序操作,如果不关心返回顺序可以加上order by null来跳过排序。

distinct fd 如果fd列有索引,且where子句中使用了该索引,则也可以使用索引优化distinct

5. 优化min、max

select min(fd2) from tt1 where m=’2012-03-29′;

select fd2 from tt1 force index (fd2) where

m=’2012-03-29′ order by fd2 limit 1;

select max(fd2) from tt1 where m=’2012-03-29′;

select fd2 from tt1 force index (fd2) where

m=’2012-03-29′ order by fd2 desc limit 1;

6. 使用explain分析查询

只能对SELECT查询执行EXPLAIN分析。可以加

EXTENED关键字,然后使用show warnings查看查

询优化器重写后的SQL,如果对分区表可以加

PARTITIONS关键字。如:

EXPLAIN EXTENED SELECT …

Mysql查询优化小结的更多相关文章

  1. mysql查询优化以及面试小结

    mysql面试小结: 1.mysql的基本架构 2.mysql的索引 btree+的原理 3.mysql的索引优化 4.mysql的sql查询优化 慢查询日志 Show prodile 全局查询日志 ...

  2. MySQL查询优化 (一)

    以下的文章主要讲述的是MySQL查询优化的5个十分好用方法,熟悉SQL语句的人都清楚,如果要对一个任务进行操作的话,SQL语句可以有很多种相关写法,但是不同的写法查询的性能可能会有天壤之别. 本文列举 ...

  3. MYSQL查询优化(Ⅱ)

    本文列举出五个MySQL查询优化的方法,当然,优化的方法还有很多. 1.优化数据类型 MySQL中数据类型有多种,如果你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他 ...

  4. Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析

    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析     Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...

  5. MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  6. 1025WHERE执行顺序以及MySQL查询优化器

    转自http://blog.csdn.net/zhanyan_x/article/details/25294539 -- WHERE执行顺序-- 过滤比较多的放在前面,然后更加容易匹配,从左到右进行执 ...

  7. MySQL查询优化:查询慢原因和解决技巧

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...

  8. mysql查询优化器为什么可能会选择错误的执行计划

    有可能导致mysql优化器选择错误的执行计划的原因如下: A:统计信息不准确,mysql依赖存储引擎为其提供的统计信息来评估成本,然而有的存储引擎提供的信息是准确的,有的引擎提供的可能就偏差很大,如: ...

  9. Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

随机推荐

  1. 欠了好久的CRM帖子,双11来读。

    又一年双11了,觉得天猫双11越来越没特色了. 从折扣,音符旋律到红包,今年15年却找不出往年的热度,只是商家还是一样的急,备着活动目标计划,做着库存价格打标视觉设计这种苦逼的日子. 欠了好久的CRM ...

  2. 程序员也有春天之HTTP/2.0配置

    哎呀,一不小心自己的博客也是HTTP/2.0了,前段时间对网站进行了https迁移并上了CDN,最终的结果是这酱紫的(重点小绿锁,安全标示以及HTTP/2.0请求). 科普 随着互联网的快速发展,HT ...

  3. 基于SSM实现的简易员工管理系统(网站上线篇)

    经历无数苦难,好不容易,网站终于上线了.=.=内牛满面ing.chengmingwei.top就是本员工管理系统的主页啦.是的,很简陋,但是毕竟是第一次嘛,所以慢慢来嘛. 如上次所说的(网站简介,见: ...

  4. java.lang.reflect.MalformedParameterizedTypeException异常问题

    做dubbo框架集成的时候,出现的问题,本来的原来的工程没有错误,引入dubbo后报错,原因是spring的jar文件冲突,我用的spring是4.x,dubbo引入的是2.5所以需要去掉,相关的po ...

  5. eclipse没有联想功能的解决办法

    1.我window->Preferences->Java->Editor->content assist 把 Enable auto activation 选项打上勾 :(如下 ...

  6. OCUpload的简单介绍与使用

     OCUpload (One Click Upload)译成中文就是一键上传的意思.它是JQuery的一个插件.   对于传统的文件上传,只能通过form表单,将enctype设置为multipart ...

  7. 【JavaScript基础系列】决定你的人生能走多远的,是基础。

    前言 javaScript门槛非常低,一点语法,一个dom,一个bom就可以使用它开发大部分js应用,再加上现在层出不穷的框架极大的简化抽象了javaScript的使用方式,但是我们始终不能忘记的一点 ...

  8. 团队作业8——第二次项目冲刺(Beta阶段)Day6——5.25

    1.提供当天会议照片: 2.会议的内容: (1)讨论已经完成的功能,讨论存在的问题 (2)对于界面,谈谈各自的看法 (3)讨论接下来的任务和改进的地方 3.工作安排: 队员 今日任务 明日任务 贡献比 ...

  9. Java零碎知识点

    █    举个例子:Iterator iter = map.entrySet().iterator(); xx.yy() ,表示一个xx对象的yy方法 ,xx.yy().zz()中 xx.yy()返回 ...

  10. 《JAVA程序设计》第9周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...