手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:mysql

ThinkInLamp Mysql专场

在开始今天的话题之前,先感谢一下傲骨,在我向板子申请小海豚未果后,他让出了他的sun海豚。
再,感谢ThinkInLamp 组委会(http://www.thinkinlamp.com),也正是由于他们的努力,我们才有了今天这么一个专场(而且很多参与者也放弃了今天同时举办的其他几个专场,比如在篱笆网的前端专场(?UED??),还有复旦的ubuntu 10.10的专场等,好象还有一个,三马说了,也没有记清)
再,StingChen【http://my1930.com】在我们听讲的时候,努力的在新浪围脖【http://t.sina.com.cn/thinkinlamp】上拼命的在直播(如果他没有PPT,那就是他打字特别快了。。。)
然后就是赞助商和几位嘉宾了(感觉今天就是Action【爱可生】和盛大的专场,有些内容就不多写了,因为StingChen的新浪围脖直播上的内容详细程度堪比PPT啊【点击查看】,可惜不支持倒排。看的会稍微有点累)。
当然我们不能忽略一些幕后工作者,ThinkInLamp的组委会和一些志愿者,他们非常努力的想办好这次专场(据说很多人都是几乎一夜没睡,看到板子【http://blog.thephper.com】的脸都是白的,虽然他们没有经验,但非常努力)
OK,开始讲讲今天的内容吧。对于一些广告我就直接无视了,只记录讲技术的。
先是老谭(谭浚青)给大家介绍了Mysql的myisam与innodb的比较,虽然很多资料大家在应用中都有接触和了解,但他还是对于myisam的key buffer和innodb的bufferpool的调优有了介绍。其中他也介绍了一个小经验,是innodb调优的,说是如果raid卡上有电源模块,那么也就可以利用raid卡上的内存来优化redo log的传输性能。(好象没记错)老谭在介绍这些信息前也介绍了Action公司正在测试的一款新产品,利用服务器上的agent来进行mysql的监控(采用WEB方式进行管理,看他的几个截图倒是真的不错)
接下来就是盛大的赵佳佳介绍了SNS数据库的设计,主要介绍了一些数据库的拆分方案,可能由于小姑娘有点拘谨,虽然内容不错,但讲的一般,大概还是紧张了吧(不过,如果要是换成我,我还会更紧张)。对于数据库的拆分,还是传统的水平拆分和垂直拆分,这两点我就不多说了,网上资料更多。完了结束时,她介绍了Amoeba:分布式数据库Proxy(希望没说错)。
Oracle的杜玉松介绍了Mysql被收购后未来的一些roadmap,也算是让我们对MYSQL的未来有些信心,不至于过份迷惘吧。傲骨倒是对电信级的server非常感兴趣,只是我却对这些没有太大兴趣。当然分区表,也是我们关心的,用lvan的话来说这点在5.5的时候就会有很大的改进,不再象现在还会存在一些BUG,让人不太敢用(感觉好象说是可以智能分区了)
接下来又是盛大的哥们介绍数据库mangoDB【被人批评写错了,应该是mongodb】,对于这个数据库,了解的人真的很多,而且不管数据量的大小,很多人都也在进行尝试(只是我们的条件不如盛大,不太可能是一下子放上几十台服务器进行尝试)。这点就是小公司的DBA不如大公司的地方了,学习环境不够好啊(结束的时候,他略介绍了几个类似的数据库redis,tc等,在介绍memcache的时候说memcache的value最大只能有1M,而mangodbmongodb可以达到4M,但事实上从最近的1.4.2版开始,memcache在启动的时候加上参数,也可以指定value的最大值了)
最后让我有印象的是Action的杨涛涛,他是直接从代码上来介绍了数据库优化的了,讲的非常简洁,真的很简洁,几句话就带过了。不过有些技巧和经验还是让我眼前一亮。。
比如以下几个sql:

SQL代码
  1. Select * from t where name like '%de%'  
  2. Select * from t where name like 'de%' 这是可优化的  
  3. Select * from t where name >= 'de' and name < 'df' 如果字符串有规律也可以利用这种方式  
  4.   
  5. Select * from where 1  
  6. Select * from where 1 limi 10  
  7.   
  8. Left join 不能仅对子表判断,可以对主表加过滤条件,避免全表扫描 。  
  9.   
  10. Select sql_no_cache * from new_ext order by id asc limit 20000,20   
  11. Select sql_no_cache * from new_ext where id >= (select id from new_exit order by id ASC limit 20000,1) limit 20  
  12. 这样的效率比上面略高  

可惜杨涛涛对于存储过程、触发器、视图等没有过多的介绍,只是说了一下,视图,玩玩可以,不要在开发机上用就成(存储过程、触发器,我都在几年前看过,也做过一些小应用,只是,全忘光了,前段时间在导数据时,连个查询循环都搞不定了)
最后一位MM的mysql高可用性,我没有记录更多。。因为她介绍的几个方法,其实都已经在正式应用中了,虽然有考虑过換新的系统架构,但換的成本也会太高,不敢尝试。

当然也得提点建议,这次餐券的初衷挺好的,但给KFC造成了很大的压力呀,一下子,并发处理不过来了。
最后,感谢傲骨的小海豚,上两张相片:
大小: 656.94 K
尺寸: 500 x 375
浏览: 1763 次
点击打开新窗口浏览全图
大小: 618.56 K
尺寸: 500 x 375
浏览: 1708 次
点击打开新窗口浏览全图
大小: 603.51 K
尺寸: 282 x 376
浏览: 1717 次
点击打开新窗口浏览全图

Tags: thinkinlamp, mysql

SQL,大量的SQL

这两天在折腾数据,写了很多很多SQL(当然是对我来说,比如象锅巴那种牛人,他们一写就是几百上千行的,我不能比),我只写了100多行。基本上所有的操作都通过SQL完成了,除非实在没办法完成的。才用PHP处理。

对我来说,这两天 insert into xxx (xxx) select xxx from xxx where xxx,写的很多了

还有update a,b set a.xx=b.xx where a.id=b.id之类的也很多

在锅巴哥哥的介绍下,还知道把一句SQL分成多句,或者用下面这张图解决。。。

大小: 65.24 K
尺寸: 360 x 376
浏览: 1768 次
点击打开新窗口浏览全图

嗯,本来想用存储过程的,但赶时间,来不及学了。几年前看的东西全忘光了。靠,晚上回去翻开我的mysql书看一下下先。

 

Tags: mysql, sql

张宴:当MySQL 和 Memcached 遇到尾部空格时

张宴遇到的问题,我没有遇到过,只是以前知道,mysql在varchar类型插入的时候,会把字符串末尾的空格取消的(难道我记错了?),char的没记。不过按照char的类型,他是会用空格补全长度。所以,即使没空格也会多出空格。但,用PHP取出来后,我就没有注意过了。。。

下面是张宴遇到的问题,不过我觉得还是有必要用PHP实现一下看看究竟怎么回事。。。

同事下午遇到一问题,MySQL 和 Memcached 对于同一个key,不能对应起来。最终原因是:PHP将key写入MySQL数据库之前,没有经过trim()过滤首尾空格(关键是尾部空格),结果:

1、MySQL的varchar、char类型字段,SELECT .... WHERE 查询时忽略字段的尾部空格。例如varchar类型字段uidcode中,存储的含有尾部空格的内容“rewinx ”,通过以下三种方式均可查询到:

大小: 4.38 K
尺寸: 420 x 351
浏览: 1605 次
点击打开新窗口浏览全图

在MySQL手册第“11.4.1. CHAR和VARCHAR类型”节中写道(http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char): 请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有 MySQL版本均如此,并且它不受SQL服务器模式的影响。

   2、PHP 的 Memcache 扩展,则在set、get时,自动将key中的空格,转换成了半角下划线“_”。当然,直接通过 Memcached 协议来读取,key值“rewinx ”就要写成“rewinx_”了。

示 例:testmc.php

PHP代码
  1. <?php  
  2. $memcache_obj = new Memcache;  
  3. $memcache_obj->connect('192.168.8.34', 11211);  
  4. $memcache_obj->set('rewinx ''hello world');  
  5. echo $memcache_obj->get('rewinx ')."\r\n";  
  6. ?>  

大小: 3.28 K
尺寸: 434 x 151
浏览: 1562 次
点击打开新窗口浏览全图

Tags: mysql, memcached

好文推荐:五款常用mysql slow log分析工具的比较

一直在用MYSQL,因此对于慢查询就非常在意,虽然自己写代码的时候不是特别注意,但真正上线后还是要关注关注的。

最简单的看LOG就是用phpmyadmin查看一下,但这终究不是办法。所幸,工具还是很多的。javaeye上就有人贴出了工具和使用方法 :

启用 slow log

有两种启用方式:
1, 在my.cnf 里 通过 log-slow-queries[=file_name]
2, 在mysqld进程启动时,指定--log-slow-queries[=file_name]选项

比较的五款常用工具

mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter

mysqldumpslow, mysql官方提供的慢查询日志分析工具. 输出图表如下:
大小: 256.22 K
尺寸: 500 x 210
浏览: 2084 次
点击打开新窗口浏览全图
主要功能是, 统计不同慢sql的
出现次数(Count), 
执行最长时间(Time), 
累计总耗费时间(Time), 
等待锁的时间(Lock), 
发送给客户端的行总数(Rows), 
扫描的行总数(Rows), 
用户以及sql语句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).

mysqlsla, hackmysql.com推出的一款日志分析工具(该网站还维护了 mysqlreport, mysqlidxchk 等比较实用的mysql工具)
大小: 211.77 K
尺寸: 500 x 268
浏览: 1987 次
点击打开新窗口浏览全图
整体来说, 功能非常强大. 数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等.
 
格式说明如下:
总查询次数 (queries total), 去重后的sql数量 (unique)
输出报表的内容排序(sorted by)
最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数.
 
Count, sql的执行次数及占总的slow log数量的百分比.
Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比.
95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间.
Lock Time, 等待锁的时间.
95% of Lock , 95%的慢sql等待锁时间.
Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量.
Rows examined, 扫描的行数量.
Database, 属于哪个数据库
Users, 哪个用户,IP, 占到所有用户执行的sql百分比
 
Query abstract, 抽象后的sql语句
Query sample, sql语句
 
除了以上的输出, 官方还提供了很多定制化参数, 是一款不可多得的好工具.
 
mysql-explain-slow-log, 德国人写的一个perl脚本.
http://www.willamowius.de/mysql-tools.html
大小: 107.58 K
尺寸: 500 x 147
浏览: 2020 次
点击打开新窗口浏览全图
大小: 98.35 K
尺寸: 500 x 145
浏览: 2019 次
点击打开新窗口浏览全图
功能上有点瑕疵, 不仅把所有的 slow log 打印到屏幕上, 而且统计也只有数量而已. 不推荐使用.
mysql-log-filter, google code上找到的一个分析工具.提供了 python 和 php 两种可执行的脚本.
http://code.google.com/p/mysql-log-filter/
大小: 179.2 K
尺寸: 500 x 156
浏览: 1969 次
点击打开新窗口浏览全图
功能上比官方的mysqldumpslow, 多了查询时间的统计信息(平均,最大, 累计), 其他功能都与 mysqldumpslow类似.
特色功能除了统计信息外, 还针对输出内容做了排版和格式化, 保证整体输出的简洁. 喜欢简洁报表的朋友, 推荐使用一下.
myprofi, 纯php写的一个开源分析工具.项目在 sourceforge 上.
http://myprofi.sourceforge.net/
大小: 176.74 K
尺寸: 500 x 137
浏览: 1974 次
点击打开新窗口浏览全图
功能上, 列出了总的慢查询次数和类型, 去重后的sql语句, 执行次数及其占总的slow log数量的百分比.
从整体输出样式来看, 比mysql-log-filter还要简洁. 省去了很多不必要的内容. 对于只想看sql语句及执行次数的用户来说, 比较推荐.

总结

工具/功能 一般统计信息 高级统计信息 脚本 优势
mysqldumpslow 支持 不支持 perl mysql官方自带
mysqlsla 支持 支持 perl 功能强大,数据报表齐全,定制化能力强.
mysql-explain-slow-log 支持 不支持 perl
mysql-log-filter 支持 部分支持 python or php 不失功能的前提下,保持输出简洁
myprofi 支持 不支持 php 非常精简
---EOF---
作者:galaxystar,来自:http://www.javaeye.com/topic/242516,他现在的博客是:http://kenwublog.com/。

Tags: slow query, mysql, tools

mysql server 小技巧

很多人都使用过mysql命令行,不可否认的是在命令行下如果频繁切换use的database,你会感觉到很迷惘,不太清楚当前的库或表是哪个,于是发现这个技巧后就欣欣然的COPY下来与各位一起分享一下。

在my.cnf 的 mysql 端 添加如下设置

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
prompt="(\u:mysql1@linuxbyte.org \R:\m)[\d]: "

会产生如下效果:

root@ubuntu:/home/hew# mysql -u hew -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 320
Server version: 5.1.41-3ubuntu12.1 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
(hew:mysql1@linuxbyte.org 21:12)[(none)]: use linuxbyte #注意这里
 
Database changed
 
(hew:mysql1@linuxbyte.org 21:13)[linuxbyte]: use linuxsky; #这里
 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
 
(hew:mysql1@linuxbyte.org 21:13)[linuxsky]: #这里

如上所示我们可以在mysql命令行下显示当前的mysql 用户,所在主机,时间和所用的数据库。
这个在关键时刻可以让我们避免很多误操作。

原文来自:http://www.blogread.cn/it/article.php?id=1605

Tags: mysql, 技巧