百度首页 | 百度空间
 
文章列表
 
您正在查看 "Mysql" 分类下的文章

2008年05月12日 星期一 下午 04:51
作者:老王

很久以前,我写过一篇文章,说明了MySQL下的几种分页方式。这些天,陆续有几个人问过我其中的子查询方式,并对子查询分页的高效率表示质疑。今天我特意做了一个试验来验证这一点。

我选择了公司一个Discuz测试论坛作为试验体,其cdb_posts的记录数接近10000000行。

先验证最基本的分页方式:

在PhpMyAdmin里执行如下SQL:

类别:Mysql | 评论(5) | 浏览()
 
2008年03月28日 星期五 上午 11:06
作者:老王

MySQL相当有个性。可能它也喜欢徐志摩的《再别康桥》:悄悄的我走了...。

今天遇到类似的情景,MySQL只是冷冷的说:MySQL server has gone away。

大概浏览了一下,主要可能是因为以下几种原因:

一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可。

还有一种可能是因为某些原因导致超时,比如说程序中获取数据库连接时采用了Singleton的做法,虽然多次连接数据库,但其实使用的都是同一
类别:Mysql | 评论(4) | 浏览()
 
2008年02月02日 星期六 下午 05:14
作者:老王

CakePHP本身有一个uuid实现,所以一直以来,我都在尝试使用uuid做主键的可能性。虽然MySQL是我最常用的数据库,但是和auto_increment_int主键相比,我对uuid主键更有好感,一方面是因为uuid的数据库无关性,另一方面是当你想把程序分布在多台服务器上时,uuid操作更简单。

不过MySQL还没有原生的uuid支持,在和innodb表类型配合时,可能会出现一些问题:

首先,innodb会对主键进行物理排序,这对auto_increment_int是个好消息,因为后一次插入的主键位置总是在最后。但是对uuid来说,这却是个坏
类别:Mysql | 评论(4) | 浏览()
 
2007年12月25日 星期二 下午 09:34
作者:老王

如果和MSSQL的TOP语法相比,那么MySQL的LIMIT语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

最基本的分页方式:

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引:

举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT
类别:Mysql | 评论(5) | 浏览()
 
2007年11月05日 星期一 下午 07:00
作者:老王

我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的KeyGenerator,也可能是我们下面要说的UUID。

据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字
类别:Mysql | 评论(11) | 浏览()
 
2007年10月19日 星期五 下午 08:13
作者:老王

对UNION的用法一直有一些不明白的地方,把手册相关记录摘抄出来,以便查阅。

-----------------------------------------

The default behavior for UNION is that duplicate rows are removed from the result. The optional DISTINCT keyword has no effect other than the default because it also specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal doe

类别:Mysql | 评论(0) | 浏览()
 
2007年09月15日 星期六 下午 08:51

作者:老王

使用show status命令可以看到MySQL的运行状态,根据他们的值可以做出相应的判断。

如果Opened_tables比Open_tables大很多,应该把my.cnf中的table_cache变大
如果Key_reads太大,则应该把my.cnf中Key_buffer_size变大,保持Key_reads/Key_read_requests至少1/100以上,越小越好。
如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表
如果Threads_created太大,就要增加my.cnf中Thread_cache_size的值,没有索引起作用
如果Created_tmp_disk_tables太大,接近Create

类别:Mysql | 评论(1) | 浏览()
 
2007年08月12日 星期日 下午 01:52

作者:老王

当我们安装好MySQL后,首要的问题就是对MySQL的各种参数进行调整以适应我们的要求。其实,MySQL本身已经为我们提供了很多现成的模板,我们可以选择合适的直接使用,比如:我们在MySQL源代码里能找到的配置文件模板有如下几种:

my-small.cnf:

# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.

my-medium.cnf

类别:Mysql | 评论(3) | 浏览()
 
2007年05月26日 星期六 下午 04:37

作者:老王

在使用MySQL的时候,我们一般使用EXPLAIN来检测SQL语句的效率,但是有时候EXPLAIN的结果并不准确,举一个简单的例子:

EXPLAIN SELECT * FROM table_name LIMIT 10;

你会发现,结果显示是全表扫描,这样的结果可以肯定是Explain的Bug。

随便说一句:Explain竟然还有一个语法是 explain extended select ...,然后可以show warnings查看扩展信息。

参考链接

类别:Mysql | 评论(3) | 浏览()
 
2007年04月26日 星期四 下午 12:33

作者:老王

问题大致是这样的:

CREATE TABLE `a` (
`id` int(11) NOT NULL auto_increment,
`tid` int(11) default NULL,
`status` int(11) default NULL,
PRIMARY KEY (`id`)
) ;

INSERT INTO `a` (`id`, `tid`, `status`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 2, 1),
(6, 2, 2);

按照tid分组,每组里找其中status最大的那一行.例如符合条件的应该为:
414
622

类别:Mysql | 评论(5) | 浏览()
 
2007年04月13日 星期五 上午 09:43

作者:老王

我使用独立的网页服务器和数据库服务器,想在网页服务器里通过LOAD DATA插入数据到数据库服务器,尝试了半天才发现LOAD DATA尝试加载的是数据库服务器端主机的文件,要加载客户端的文件,必须使用LOAD DATA LOCAL。

查看手册,果然发现相关资料

LOAD DATA语句可以装载服务器主机上的文件,若指定LOCAL关键字,可以装载客户端文件。

如果你从源码构建MySQL但没有

类别:Mysql | 评论(0) | 浏览()
 
2007年04月02日 星期一 下午 05:40

作者:老王

在使用MySQL的过程中,ORDER BY ... LIMIT ... 语句的优化总是一个大问题,通过EXPLAIN语句检测出来的很多问题根源都是由于不了解ORDER BY ... LIMIT ... 所至。

参考资料:http://www.mysqlperformanceblog.com/category/optimizer/

类别:Mysql | 评论(3) | 浏览()
 
2007年03月14日 星期三 上午 11:26
作者:老王

记得上次我介绍MySQL主从服务器的时候,说最好只有一个Master主服务器,如果多于一个的话,在处理auto_increment字段的时候会出现不一致的问题。结果今天我发现我的说法是错误的,解决这个问题其实很简单,只要设置一下my.cnf就可以采用Master-Master结构的主主服务器了:

A服务器的my.cnf设置如下:

auto_increment_offset = 1
auto_increment_increment = 2

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, ...

B服务器的my.cnf设置如下:
类别:Mysql | 评论(1) | 浏览()
 
2007年03月09日 星期五 下午 05:56

作者:老王

#!/bin/bash

MYSQLDUMP=/usr/local/mysql/bin/mysqldump

cd /data/webback/mysql
$MYSQLDUMP --opt --all-databases > mysql.sql 2>/root/mysqldump.error.log
tar zcvf mysql.`date +%Y%m%d`.tar.gz mysql.sql >/dev/null 2>&1
rm -f mysql.sql

find . -type f -mtime +7 | xargs rm -f

写成一个shell放到/etc/cron.daily目录中就可以了。

注:备份最近七天

类别:Mysql | 评论(1) | 浏览()
 
2007年03月03日 星期六 下午 09:50
在MySQL中,我们通常可以使用init_connect来制定编码,但是如果使用的超级用户的话,则init_connect选项无效。
[mysqld]
init_connect='SET NAMES utf8'
init_connect
A string to be executed by the server for each client that connects. The stri
类别:Mysql | 评论(0) | 浏览()
 
     
 
 
文章分类
 
 
Linux(25)
 
Apache(12)
 
Mysql(19)
 
Php(45)
 
 
 
 
 
 
     
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   

顶一下
 
 
 
 
 
     


©2008 Baidu