MYSQL中提供了一个计算表达式性能的函数BENCHMARK。
语法
BENCHMARK(count,expr)
BENCHMARK会重复计算expr表达式count次,通过这种方式就可以评估出mysql执行这个expr表达式的效率。这个函数的返回值始终是0,但可以根据客户端提示的执行时间来得到BENCHMARK总共执行的所消耗的时间,如以下这个例子
mysql> SELECT BENCHMARK(1000000,ENCODE(’hello’,'goodbye’));
+———————————————-+|
BENCHMARK(1000000,ENCODE(’hello’,'goodbye’)) |
+———————————————-+|
0 |
+———————————————-
+1 row in set (4.74 sec)上面例子中的4.74 秒指的是在mysql客户端总共消耗的时间。
BENCHMARK函数只能测量数字表达式(scalar expression)的性能,虽然说表达式可以是一个子查询,但子查询返回的只能是单个值。在BENCHMARK(10, (SELECT * FROM t)) 这个语句中,如果t表有多列或是t表中记录多于1行的话这个函数就会执行失败。BENCHMARK函数在执行多次的过程中sql的解析(parser)、优化(optimizer)、锁表(table locking)等操作只会进行一次,只有运行评估(runtime evaluation)会执行count次。 利用BENCHMARK,mysql就可以自动为我们多次执行表达式计算,从而获取比较平均的计算结果。
参考资源
MySQL的benchmark函数
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_benchmark
How FriendFeed uses MySQL to store schema-less data 这篇文章发布已经有一段时间了,之前也读过没留下什么映像,最近又重读了一遍做了一些笔记,内容如下。
- 数据库查询需要得到索引的支持,索引在加速查询的同时,也会直接影响了数据插入、更新的速度。另外,由于FriendFeed的数据量比较大,维护索引而引起的相关表的锁表时间会比较长。
- FriendFeed使用了读写分离技术和memcache来提升数据读取吞吐量
- FriendFeed使用了Sharding技术来提升数据写入吞吐量
- 由于Sharding技术的使用,有些很基础的关系运算就不能被支持了,例如Join。这样Mysql退化成了一个键值(KeyValue)数据库。
- 键值数据库很多。FriendFeed没有使用专门的键值数据库可能考虑多种原因
- 存储表的物理主键是autoincremen,而逻辑上的主键使用的是uuid。之所以这样做是因为uuid的不重复性对数据分布有好处,但因为InnoDB表类型会按照主键排序,此时如果使用类似uuid这样的无序串作为主键的话,那么当插入新行的时候,新行在数据文件中的位置是不确定的,这就会带来一个沉重的IO负担,而如果采用自增字段作为主键的话就不存在这个问题,因为新行始终位于数据文件的结尾。
关于FriendFeed如何保存schema-less数据的细节,这里就不在描述了,大家可以参考How FriendFeed uses MySQL to store schema-less data 或是老王的解读FriendFeed对MySQL的使用
参考资料
How FriendFeed uses MySQL to store schema-less data 原文
解读FriendFeed对MySQL的使用
mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句。
慢查询配置和使用
在msyqld的启动配置文件或命令行参数中增加以下参数
long_query_time=1
log-slow-queries=/var/mysql/logs/slow.log
long_query_time参数表示的是慢查询的度量时间,单位是秒,最小是1,缺省值是10,凡是执行时间超过long_query_time的sql语句都会记录到慢查询日志中。
--log-slow-queries[=file_name]的file_name参数可选,缺省值是host_name-slow.log,如果指定了file_name参数的话,mysql就会把慢查询的日志记录到file_name所设定的文件中,如果file_name提供的是一个相对路径,mysql会把日志记录到mysql的data目录中。
未使用索引查询配置和使用
在mysql的启动配置文件或命令行参数中增加--log-queries-not-using-indexes 参数就可以启用未使用索引查询语句了,日志记录的文件就是log-slow-queries对应的文件。
//mysql.conf
log-queries-not-using-indexes
使用案例
mysql的配置如下
[mysqld]
#Slow Query log
long_query_time=3
log-slow-queries
# Log queries that is not using indexes
log-queries-not-using-indexes
执行以下命令
select sleep(1);
select sleep(3);
select * from t1;
日志内容如下
D:\MySQL\MySQL Server 5.1\bin\mysqld, Version: 5.1.31-community-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time Id Command Argument
# Time: 090625 12:58:09
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 3.000077 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1245905889;
select sleep(3);
# Time: 090625 12:58:42
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 0.046876 Lock_time: 0.031251 Rows_sent: 0 Rows_examined: 0
SET timestamp=1245905922;
select * from t1;
其他
除此之外还有一些专门的慢查询日志分析、查询工具,大家可以google以下相关的内容。
相关资料
mysql参考手册#Slow Query Log
MySQL 优化之 Slow Query Log
根据我的经验任何一个密码至少会被遗忘一次:-)。这不这次忘了我开发环境上的密码,不急,不急,之前也在网上看到过mysql root密码丢失以后重设的教程,google一把直接拿来用了。
步骤一 增加–skip-grant-tables启动参数
–skip-grant-tables 这个参数用来开启mysql不需要密码就能登陆mysql的功能,这个sql可以加在mysql的配置文件(例如windows下的mysql.ini)或是mysqld的启动命令行中。
windows 下 mysql安装所以盘/mysql/bin/safe_mysqld –skip-grant-tables
/usr/bin/safe_mysqld –skip-grant-tables
或是在mysql.ini 的[mysqld]配置段落中加上
skip-grant-tables
步骤二 重启mysql,修改root密码
配置好skip-grant-tables参数以后,就可以重新启动mysql。接下来就是修改mysql的root密码。
use mysql
update user set password=password("new_pass") where user="root";
也可以用
mysqladmin -u root flush-privileges password newpassword
步骤三 去掉skip-grant-tables参数,重启mysql
用新配置的root密码登录试一下,如果操作没有错误的话,就OK了!
相关文章
忘记mysql 密码的取回方法
MySQL root password recovey
在之前的2-3年从事的开发工作中都使用到了MySQL数据库,对MySQL的关注和学习也越来阅读。不过在之前主要的学习内容还是基于Mysql做一些开发,很少涉及Mysql的性能调优与架构设计。随着工作环境和重心的改变,以后会多一点时间学习Mysql的性能调优与架构设计相关的内容。最近有一本《MySQL性能调优与架构设计》刚刚上市,马上买了一本。这本书的作者是阿里巴巴的简朝阳,阿里巴巴有不少优秀的架构师和DBA,希望以后能够读到他们更多的著作。
