一. 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基本介绍和优化技巧的更多相关文章

  1. 101个MySQL的调节和优化技巧

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  2. Get MySQL这5个优化技巧

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...

  3. 日常工作中常见的mysql优化技巧

    1.介绍一下MYSQL经常使用的优化技巧. MySQL 自带 slow log 的分析工具 mysqldumpslow ,可是没有说明.本文通过分析该脚本,介绍了其用法. slow log 是 MyS ...

  4. 【转】101个MySQL调试和优化技巧

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  5. 100+个MySQL调试和优化技巧

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  6. SQL优化技巧

    我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...

  7. mysql原理以及相关优化

    说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...

  8. 101个MySQL 的调节和优化的提示

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  9. 101个MySQL的调节和优化的Tips

    MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些 ...

随机推荐

  1. phpnow下mysqli加载不了的问题

    用了phpnow也有蛮长一段时间了.一直感觉还不错,不过就是差点把手动配置apache/php/mysql环境的方法都给忘了. 这几天一直都在找crm系统,可惜没有几个满意的.今天逛上了weberp这 ...

  2. jmeter控制器

    1.仅一次控制器  这个控制器可以保证线程在多次循环跑得情况下只登陆一次 2.循环控制器(Loop Controller:设置循环次数 结果: 3. ForEach控制器(ForEach Contro ...

  3. Qt 对象间的父子关系

    C++中只要有一个new就必须要有一个delete与之对应 但是Qt中的对象之间有特殊的关系 Qt 对象间的父子关系 每一个对象都保存有它所有子对象的指针 每一个对象都有一个指向其父对象的指针 par ...

  4. Ueditor自定义默认宽度高度

    如题. 最近需要使用到网页后台富文本编辑器.经过同学推荐,最后决定使用百度家的Ueditor. 官方地址:http://ueditor.baidu.com/website/ 贴吧地址:ueditor讨 ...

  5. 使用Java程序发送Email

        目前很多大型的网站忘记登录密码常见的一种形式是使用邮箱找回密码  最近做项目也有这个需求  现在总结一下  以便以后查看 使用到的包有 mailapi.jar smtp.jar   封装发送邮 ...

  6. 王灏:光音网络致力打造Wi-Fi大生态圈

    光音网络,做的是本地网络综合服务.在中国,想把互联网做到覆盖延伸范围之外的最后100米,光音网络是当中一家,也是最坚持的一家.为千万家本地生活商户提供帮助,为数亿本地用户提供最佳的本地网络体验,这是光 ...

  7. 在storyboard中的静态UITableView中拖入 UISearchBar and Search Display Controller出现的奇怪问题

         近期学习过程中想模拟一下新浪微博"发现"界面.      我在storyboard中拖入一个UITableViewController,设置这个UITableViewCo ...

  8. poj 2081 Recaman's Sequence

    開始还以为暴力做不出来,须要找规律,找了半天找不出来.原来直接暴力.. 代码例如以下: #include<stdio.h> int a[1000050]; int b[100000000] ...

  9. qemu 的方式安装debian 模拟powerpc

    http://bbs.pediy.com/showthread.php?p=1424746http://www.ibm.com/developerworks/cn/linux/l-qemu/ 线总结下 ...

  10. Flume NG中的Kafka Channel

    kafka(官网地址:http://kafka.apache.org)是一款分布式消息发布和订阅的系统 在Flume中的KafkaChannel支持Flume与Kafka整合,可以将Kafka当做ch ...