存档

‘MYSQL’ 分类的存档

MYSQL的BENCHMARK函数

2009年8月10日 admin 没有评论

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

分类: MYSQL 标签:

《How FriendFeed uses MySQL to store schema-less data》阅读笔记

2009年6月29日 admin 没有评论

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慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用

2009年6月25日 admin 没有评论

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 标签: ,

mysql root密码重新设定

2009年6月25日 admin 没有评论

根据我的经验任何一个密码至少会被遗忘一次:-)。这不这次忘了我开发环境上的密码,不急,不急,之前也在网上看到过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

分类: MYSQL 标签:

购买新书《MySQL性能调优与架构设计》

2009年6月20日 admin 没有评论

在之前的2-3年从事的开发工作中都使用到了MySQL数据库,对MySQL的关注和学习也越来阅读。不过在之前主要的学习内容还是基于Mysql做一些开发,很少涉及Mysql的性能调优与架构设计。随着工作环境和重心的改变,以后会多一点时间学习Mysql的性能调优与架构设计相关的内容。最近有一本《MySQL性能调优与架构设计》刚刚上市,马上买了一本。这本书的作者是阿里巴巴的简朝阳,阿里巴巴有不少优秀的架构师和DBA,希望以后能够读到他们更多的著作。

分类: MYSQL 标签: ,