mysql基本介绍和优化技巧
一. mysql框架和基本介绍
1. 框架图
更详细:

2. 存储引擎
MYISAM与INNODB对比:
MYISAM:mysql5.1及以前版本的默认存储引擎。支持全文检索,压缩,表级锁等,但不支持事务,行级锁,崩溃后的数据恢复等
INNODB:mysql5.5及之后的默认存储引擎。支持事务,行级锁,数据恢复,mysql5.6 中的innodb(1.2)支持全文检索。
如何选择:innodb对于绝大多数的用户都是最佳的选择,除非某些存储引擎能满足特殊需求且使用者很了解这种存储引擎。
二. 查询性能的方法
1. 配置文件 my.cnf (linux),
读配置文件的一般顺序:
1) /etc/my.cnf
2) DATADIR/my.cnf
3) ~/.my.cnf
可以通过命令获知:
mysqld --verbose --help | grep -A 1 'Default options’
结果:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
2. 环境变量
从my,cnf读取环境变量值,
查看变量值方法: show variables like “”, (不清楚变量名时,用模糊匹配%)
例如
设置(全局)变量方法:
set (global) 变量名=变量值
例如设置 开启慢查询日志
set global slow_query_log=1;
设置后查看变量值
show variables like "%slow%”;
| slow_query_log | ON
变量列表:http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html
分析sql语句时一些有用且默认不开启的变量:
1) 慢查询日志: 开关 slow_query_log, 阈值:long_query_time (单位 秒)
2) sql剖析工具profile,开关:profiling,历史记录数:profiling_history_size(最大为100)
3) 记录每条sql语句,开关:general_log, log文件位置:general_log_file
… …
3. 查看sql服务状态
语法 SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr]清除状态 FLUSH STATUS;
清除表缓存
reset query cache ;
FLUSH TABLE [TABLE NAME]
用法举例
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler_read%’; (SHOW SESSION STATUS LIKE 'Handler_%’;)
EXPLAIN SELECT …;
具体参数可以参考:
http://lxneng.iteye.com/blog/451985
http://hi.baidu.com/thinkinginlamp/item/8d038333c6b0674a3075a1d3
4. 查询剖析工具 show profiles
开启
set profiling=1;
set profiling_history_size=50 最大为100
用法:
show profiles;
show profile; //展示最后一条query时间消耗
show profile for query ID; // 替换ID值 从show profiles 表里。
显示更多内容
show profile cpu,block io for query 4;
5. 获取查询计划的信息 explain
用法 explain [sql查询语句]
例如:
注意每列的含义
三. 数据类型优化
1. 选择优化的数据类型原则
1)尽量使用可以正确存储数据的最小数据类型。例如: 只存0-200,用tinyint unsigned 更好。
2)选择简单的数据类型。例如整形比字符操作代价更低,存储时间用datetime而不是字符串,用整形存储ip。
2. 数据类型(主要说整形和字符串)
1)整型
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
思考:tinyint(1)和tinyint(2)存储空间相比较?
2)字符串
varchar:内容+长度,0-255字节。
char:长度不足时,空格补足,0-255字节。
如何选择:
选择用varchar:字符串的最大长度比平均长度大很多,列更新少。但是一定要估算好长度(排序时)。
text和blob,大数据类型。
3)浮点,时间,位 等
四. 高性能索引
1. 索引基础
索引结果为B+树。
B树:

B-树:

B+树:

MYISAM 主索引(辅助索引结构与其相同):

INNODB 主索引:

INNODB辅助索引:

索引优点:
1) 索引大大减少了服务器需要扫描的数据量;
2) 索引可以帮助服务器避免排序和临时表;
3) 索引可以将随机I/O变为顺序I/O。
2. 高性能索引策略
1) 独立的列
将索引单独放到比较符号的一侧,否则无法利用索引。
2)前缀索引和索引选择性

3)合适的索引顺序
4)覆盖索引
极大的提高性能。
5)使用索引扫描做排序
其他策略:
1)多条件过滤,尽量重复利用索引,(sex,country,age)有索引,现在有查询条件 sex,country,region,age 或者sex,country,region,city,age需要再建索引吗?
例如:(gender,name) gender,gender name
select * from staff where name like “123”;
select * from staff where gender in (0,1) and name like “123";
2) 避免多个范围查询
3)延迟关联
select * from table2 order by cnt,id limit 100000,10;
select * from table2 join (select id from table2 order by cnt limit 100000,10) as x using(id) ;
五. 查询性能优化
1) 查询执行的基础

2) 查询优化器的局限性
union限制
(select first_name,last_name from actor order by last_name) union (select first_name,last_name from customer order by last_name) order by last_name limit 20;
(select first_name,last_name from actor order by last_name limit 20) union (select first_name,last_name from customer order by last_name limit 20) order by last_name limit 20 ;
在同一个表上查询和更新
update foo as outer set cnt= (select count(*) from foo as inner where inner.type=outer.type);
update foo join (select type,count(*) as cnt from foo group by type) as der using(type) set foo.cnt=der.cnt;
3)优化特定关联查询
优化关联:
explain select * from film inner join (film_actor,actor) on (film.film_id = film_actor.film_id and film_actor.actor_id = actor.actor_id); explain select straight_join * from film inner join (film_actor,actor) on (film.film_id = film_actor.film_id and film_actor.actor_id = actor.actor_id);
优化limit
优化sql_calc_found_rows
select sql_calc_found_rows * from table2 order by cnt,id limit 100000,10;
select found_rows();
selelt count(*) from table ..
mysql基本介绍和优化技巧的更多相关文章
- 101个MySQL的调节和优化技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- Get MySQL这5个优化技巧
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...
- 日常工作中常见的mysql优化技巧
1.介绍一下MYSQL经常使用的优化技巧. MySQL 自带 slow log 的分析工具 mysqldumpslow ,可是没有说明.本文通过分析该脚本,介绍了其用法. slow log 是 MyS ...
- 【转】101个MySQL调试和优化技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- 100+个MySQL调试和优化技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- mysql原理以及相关优化
说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...
- 101个MySQL 的调节和优化的提示
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- 101个MySQL的调节和优化的Tips
MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些 ...
随机推荐
- javascript函数定义表达式和函数声明的区别
在javascript中,函数有两种定义写法,函数定义表达式和函数声明,其例子分别如下所示: var test = function(x){ return x; } function test(x){ ...
- ASP.NET MVC- VIEW Using the TagBuilder Class to Build HTML Helpers Part 3
The ASP.NET MVC framework includes a useful utility class named the TagBuilder class that you can u ...
- Android iOS Dribbble风格边栏菜单实现
随着IOS7的推出,大量移动应用也开始进行了重新设计.,开始应用大量的扁平化.可以说现在IOS和Android的风格设计方面确实是在逐渐地靠拢. ReisdeMenu 创意灵感来自于Dribbble( ...
- 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm
BrowserSwarm是一个免费工具,能够自动化跨平台测试JavaScript.
- XRDP与VNC的关系
如果仅仅安装XRDP协议.是不能在windows上使用远程桌面连接到Ubuntu. 还须要安装VNCServer才行. 所以,XRDP启动之后.系统会自己主动启动一个VNC会话进程监听服务. 当我们通 ...
- [ES7] Descorator: evaluated & call order
When multiple decorators apply to a single declaration, their evaluation is similar to function comp ...
- Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者
首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...
- python 入门1
python的历史 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Per ...
- hibernate自动建表采用UTF-8字符编码
hibernate自动建表采用UTF-8字符编码 hibernate建表默认为UTF-8编码 >>>>>>>>>>>>>& ...
- quartz简单实现
quartz介绍 在我们的项目中,经常会遇到某个任务需要在特定的时间点执行,这个时间点可能是每天的某分某秒,可能是一周的指定某个星期某个时间等:quartz就是实现这样一个复杂任务调度逻辑的框架. 官 ...