MySql 查询优化
2015-10-16 17:48
483 查看
数据库的查询优化有很多事情可以做。下面总结了一些:
基本原则:
减少数据库查询时发生的磁盘I/O数
合理利用索引
避免全表遍历、扫描
减少网络传输数据量
只查询需要的字段
如果同时有Group By和Join,尽量先Group By后再Join
避免在where语句中使用MySQL函数
使用locate(substr, str)代替 like '%substr%'
使用组合索引(对超长字段使用sub_part())
避免使用select *,应该直接指定要select的字段
select *会导致数据库先把*翻译成实际的字段,多了一步操作
*中不是每个字段都是我们需要的,浪费了磁盘I/O和网络传输
如果我们需要select的字段(比如user_id)已经建立了索引,select user_id将直接从索引中返回结果,而select * 需要从数据表中查找结果,至少多了一次磁盘I/O
优化工具:
连续运行若干次,看总耗时:
SELECT BENCHMARK(100000000, LOCATE('foo','foobar'));
SELECT BENCHMARK(100000000, 'foobar' LIKE '%foo%');
查看是否用到了索引:
Explain <SQL语句>
可以被建立索引的字段:
哪些字段需要建立索引:用于JOIN、WHERE、ORDER BY、GROUP BY、MAX()、MIN()等字段上
哪些字段不适合建索引:含有大量重复值的字段,如布尔型
索引生效条件:
哪些情况索引会生效:
使用>, >=, =, <, <=, IF NULL和BETWEEN
使用MAX()和 MIN()函数的情况
被ORDER BY、GROUP BY使用的情况
LIKE使用通配符在最后的时候:where a like 'b%'
对于组合索引(multiple-column index 或 composite index),如(c1,c2):where c1=1生效,where c1=1 and c2=2生效
哪些情况索引不会生效:
使用NOT IN、<>的情况
LIKE使用通配符开始的时候:where a like '%b'
如果WHERE中的列已经建立了索引,ORDER BY中另外一个列的索引不会生效
对于组合索引,如(c1,c2):where c2=2不生效
对列进行运算的情况下,如:WHERE YEAR(iDate)<2015(可改为WHERE iDate<'2015-01-01')
MySQL索引类型:
NORMAL:普通索引类型,没有唯一性限制
UNIQUE:要求被索引字段的值都是唯一的
FULLTEXT:可以在varchar或text类型上创建,只能用于MyISAM类型的表
索引字段的数据类型选择:
被索引的字段尽量使用小和简单数据类型(比如整形),避免使用复杂类型(比如字符串类型)
被索引的字段尽量限制为NOT NULL,可以使用0、-1、空串代替NULL
(原创文章,转载请注明转自:http://blog.csdn.net/clementad)
查看是否用到了索引:
Explain <SQL语句>
版权声明:转载请注明转自Clement-Xu的csdn博客。
基本原则:
减少数据库查询时发生的磁盘I/O数
合理利用索引
避免全表遍历、扫描
减少网络传输数据量
只查询需要的字段
如果同时有Group By和Join,尽量先Group By后再Join
避免在where语句中使用MySQL函数
使用locate(substr, str)代替 like '%substr%'
使用组合索引(对超长字段使用sub_part())
避免使用select *,应该直接指定要select的字段
select *会导致数据库先把*翻译成实际的字段,多了一步操作
*中不是每个字段都是我们需要的,浪费了磁盘I/O和网络传输
如果我们需要select的字段(比如user_id)已经建立了索引,select user_id将直接从索引中返回结果,而select * 需要从数据表中查找结果,至少多了一次磁盘I/O
优化工具:
连续运行若干次,看总耗时:
SELECT BENCHMARK(100000000, LOCATE('foo','foobar'));
SELECT BENCHMARK(100000000, 'foobar' LIKE '%foo%');
查看是否用到了索引:
Explain <SQL语句>
可以被建立索引的字段:
哪些字段需要建立索引:用于JOIN、WHERE、ORDER BY、GROUP BY、MAX()、MIN()等字段上
哪些字段不适合建索引:含有大量重复值的字段,如布尔型
索引生效条件:
哪些情况索引会生效:
使用>, >=, =, <, <=, IF NULL和BETWEEN
使用MAX()和 MIN()函数的情况
被ORDER BY、GROUP BY使用的情况
LIKE使用通配符在最后的时候:where a like 'b%'
对于组合索引(multiple-column index 或 composite index),如(c1,c2):where c1=1生效,where c1=1 and c2=2生效
哪些情况索引不会生效:
使用NOT IN、<>的情况
LIKE使用通配符开始的时候:where a like '%b'
如果WHERE中的列已经建立了索引,ORDER BY中另外一个列的索引不会生效
对于组合索引,如(c1,c2):where c2=2不生效
对列进行运算的情况下,如:WHERE YEAR(iDate)<2015(可改为WHERE iDate<'2015-01-01')
MySQL索引类型:
NORMAL:普通索引类型,没有唯一性限制
UNIQUE:要求被索引字段的值都是唯一的
FULLTEXT:可以在varchar或text类型上创建,只能用于MyISAM类型的表
索引字段的数据类型选择:
被索引的字段尽量使用小和简单数据类型(比如整形),避免使用复杂类型(比如字符串类型)
被索引的字段尽量限制为NOT NULL,可以使用0、-1、空串代替NULL
(原创文章,转载请注明转自:http://blog.csdn.net/clementad)
查看是否用到了索引:
Explain <SQL语句>
版权声明:转载请注明转自Clement-Xu的csdn博客。
相关文章推荐
- 查询练习mysql
- 【Mysql学习笔记】DDL、DML、DCL区别
- mysql 函数大全
- MYSQL SQL表操作
- 超级简单的mysql主从数据库配置攻略以及错误处理
- Ubuntu下mysql数据库自动备份脚本
- MySQL(17):Select-union(联合查询)使用注意事项
- MySQL的事务处理及隔离级别
- MySQL(16):Select-union(联合查询)
- MySQL(15):Select-distinct(返回非重复的记录)
- 数据库中间件扩展 MySQL 集群:kingshard
- MySQL数据库的存储结构
- 采用keepalived施工可用性MySQL-HA
- MySQL EXPLAIN 实践汇总
- mysql数据库迁移
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- Mysql优化
- MySQL批量导出、导入文本数据
- Nutch2.3 + Mysql(错误解决方案)
- MySQL九读书笔记 字符串模式匹配