mysql服务可以把超过指定规定时间的sql语句已日志的方式记录下来,检查当前mysql服务有没有记录慢查询的命令为:
/usr/local/mysql/bin/mysqladmin var | grep log_slow | tr -d "|"
如果看到log_slow_queries OFF则没有启用,启用的方法很简单,把如下配置放在mysql的配置文件my.cnf中的mysqld段里即可。
log-slow-queries = /var/lib/mysql/slow-queries.log
long_query_time = 1
log-queries-not-using-indexes
log-slow-admin-statements
上面的配置打开了slow query日志,将会捕获了执行时间超过了1秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql /slow-queries.log文件中。
log-slow-queries
存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。
long_query_time
如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒。
log-queries-not-using-indexes
MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。
log-slow-admin-statements
一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。
需要说明的是long_query_time很多地方都说最小是1秒,其实该值可以是一个浮点数,起码在mysql 5版本中可以这么配置,例如 0.1,也就是100毫秒。
增加的列位于最后
alter table table_name add col_name varchar(20);
alter table table_name add col_name varchar(20) default 'test' not null;
alter table table_name add column col_name varchar(20) default 'test' not null;
增加的列在指定的列之后
alter table table_name add col_name varchar(20) after exists_col_name;
增加的列位于第一列
alter table table_name add col_name varchar(20) first;
修改列的类型
alter table table_name modify col_name varchar(40); //假设原来的类型是varchar(20)
alter table table_name modify col_name int(11); //从varchar修改为int
alter table table_name change col_name col_name varchar(20); //从int修改为varchar
修改列名
alter table table_name change old_col_name new_col_name varchar(20);
alter table table_name drop col_name;
alter table table_name drop column col_name;
MySql服务器端本身可以通过配置以日志的方式记录下来那些耗时的sql语句,对给系统调优提供一些参考信息,同样java的jdbc Driver也支持这样的功能,只需要在jdbc中增加logSlowQueries和配置即可slowQueryThresholdMillis,其中logSlowQueries参数设置是否打印出慢sql,slowQueryThresholdMillis定义一个时间,单位是毫秒,超过这个时间的就是慢sql,也就会打印出来。例如jdbc配置如下:
jdbc:mysql://localhost:3306/database_name?autoReconnect=true&useUnicode=true&characterEncoding=utf8
&logSlowQueries=true&slowQueryThresholdMillis=0
对单表执行更新没有什么好说的,无非就是update table_name set col1 = xx,col2 = yy where col = zz,主要就是where条件的设置。有时候更新某个表可能会涉及到多张数据表,例如:
update table_1 set score = score + 5 where uid in (select uid from table_2 where sid = 10);
其实update也可以用到left join、inner join来进行关联,可能执行效率更高,把上面的sql替换成join的方式如下:
update table_1 t1 inner join table_2 t2 on t1.uid = t2.uid set score = score + 5 where t2.sid = 10;
有一个应用运行在aws的ec2上面,由于存储硬盘比较小,只有8G左右的容量,最初刚配置好环境(按照了php、mysql、nginx等),使用的硬盘只有不到3G,运行一段后,发现硬盘已经用了5G多了,即使清除了nginx的日志,硬盘还是接近5G。决定找出是谁占用了硬盘空间。
通过命令
du -h –max-depth=1 /
查看根目录下每个文件夹所占用存储的大小,发现/var占用了快3G,进一步使用du命令,发现是存放mysql数据文件的文件夹占用了绝大部分空间,进入该文件夹,发现有很多mysql-bin.00000开头的文件,而且其中的某些达到了1G以上,google发现原来这些用户是mysql记录的日志文件,用于数据库崩溃后恢复数据和主从数据库进行数据同步的。如果没有进行主从数据库,可以通过修改配置文件让mysql关闭记录操作日志功能,关闭只需要在log-bin=mysql-bin前加上一个“#”即可,不要忘记重启mysql服务。
清理日志方法为:
PURGE MASTER LOGS TO 'mysql-bin.000013';
或
PURGE MASTER LOGS BEFORE '2010-10-18 00:00:00';
另外可以通过 RESET MASTER 来删除整个日志文件,注意,如果使用主从数据库,在操作前先确保从数据库已经完全同步了主数据库的数据。
上述命令都是登陆到mysql后执行的。
用mysqldump导出一个数据库,其中有两个表数据有20多W,执行导入的时候老是保内存溢出,试验了多种方法,始终不行,后来看mysql的服务器的配置,发现里面没有啥设置,于是在里面增加一个max_allowed_packet=32M配置,然后重新导入时候没有报错,数据完全导入了。
后来发现mysqldump导出的数据默认是–complete-insert,及把所有的值都写在一行,估计插入的时候会全部读入内存从而导致内存溢出,然后可以通过–extended-insert=false(默认为true)来设置每一条记录都是一个insert语句,但是这样速度上肯定不及前面那种。
本文详细介绍在linux下如何安装mysql。mysql的版本是预编译好的二进制包,非rpm。
下载地址:http://dev.mysql.com/downloads/mysql/5.1.html,在Select Platform中选择Linux-generic,在列表中找到Generic Linux (glibc 2.3) (x86, 32-bit), Compressed TAR Archive,如果是64位系统,选择对应的64位的包。
groupadd mysql
useradd -g mysql mysql
在centos下通过rpm -qa | grep mysql 查找一把,如果存在就通过 rpm -e mysql rpm名来卸载。
1、cd /usr/local
2、tar -zxvf /pathto/mysql-5.1.58-linux-i686-glibc23.tar.gz
3、ln -s mysql-5.1.58-linux-i686-glibc23 mysql
4、cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
5、vi /etc/my.cnf
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#增加的项
datadir = /var/lib/mysql/data
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /var/lib/mysql/data
innodb_data_file_path = ibdata1:2000M:autoextend
innodb_log_group_home_dir = /var/lib/mysql/data/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
6、mkdir -p /var/lib/mysql/data
7.1、cd /usr/local/mysql/
7.2、./scripts/mysql_install_db
如果出现错误,试着用 /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data
8、chown -R mysql:mysql /var/lib/mysql
9、cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
10、/etc/init.d/mysqld start
在5.1.60按照此方法安装后,启动时报错,从错误日志发现mysqld用的数据目录还是默认的/usr/local/mysql/data/,没有使用my.cnf中设置的,解决办法可以修改/etc/init.d/mysqld,找到datadir并把它设置为自己的数据目录,另外在这个版本中似乎已经不支持在my.cnf中设置datadir了,使用mysqld_safe启动时候出现过警告,The data directory is a deprecated location for my.cnf, please move it to …。