mysql5.5性能优化-内存表
临时表与内存表
event_scheduler=1
2 . Mysql 5.5 无法远程登陆:Can't get hostname for your address
错误信息:Can't get hostname for your address
修改配置文件
在windows下面,文件时my.ini,在Linux下面是my.cnf
解决方案是在
[mysqld]
skip-name-resolve #加上这一个属性
它将禁止 MySql Server 对外部连接进行 DNS 解析,使用这一选项可以消除 MySql 进行 DNS 解析的时间。
但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求。
可以这么理解mysql处理客户端解析的过程:
1,当 mysql client 发起连接请求时,MySql Server 会主动去查 client 的主机名。
2,首先查找Windows系统目录下 /etc/hosts 文件,搜索域名和IP的对应关系。
3,如果hosts文件没有,则查找DNS设置,如果没有设置DNS服务器,会立刻返回失败;如果设置了DNS服务器,就进行反向解析,直到timeout。
注意:如果开启 skip-name-resolve 选项,要确认 MySql 是否采用过主机名的授权,
在 mysql 中运行如下命令:
mysql> select user,host from mysql.user where host <> 'localhost' ;
一般会得到以“%”授权(也就是任何地址)的记录:
+------------------+-------------+
| user | host |
+------------------+-------------+
| root | % |
| user_sync | 192.168.0.113 |
如果有host名是什么“DB1”“DB2”的,那么删除授权表中有 hostanme 的记录,然后重启mysqld。
3。mysql JDBC 驱动常用的有两个,一个是gjt(Giant Java Tree)组织提供的mysql驱动,其JDBC Driver名称(JAVA类名)为:org.gjt.mm.mysql.Driver详情请参见网站:http://www.gjt.org/另一个是mysql官方提供的JDBC Driver,其JAVA类名为:com.mysql.jdbc.Driver
驱动下载网址:http://dev.mysql.com/downloads/,进入其中的MySQL Connector/J区域下载。
mysql JDBC URL格式如下:
jdbc:mysql://[host:port]/[database][?参数名1][=参数值1][&参数名2][=参数值2]...
参数名称 |
参数说明 |
缺省值 |
最低版本要求 |
user |
数据库用户名(用于连接数据库) |
|
所有版本 |
password |
用户密码(用于连接数据库) |
|
所有版本 |
useUnicode |
是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true |
false |
1.1g |
characterEncoding |
当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk |
false |
1.1g |
autoReconnect |
当数据库连接异常中断时,是否自动重新连接? |
false |
1.1 |
autoReconnectForPools |
是否使用针对数据库连接池的重连策略 |
false |
3.1.3 |
failOverReadOnly |
自动重连成功后,连接是否设置为只读 |
true |
3.0.12 |
maxReconnects |
autoReconnect设置为true时,重试连接的次数 |
3 |
1.1 |
initialTimeout |
autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 |
2 |
1.1 |
connectTimeout |
和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 |
0 |
3.0.1 |
socketTimeout |
socket操作(读写)超时,单位:毫秒。0表示永不超时 |
0 |
3.0.1 |
对应中文环境,通常mysql连接URL可以设置为:
jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false
在使用数据库连接池的情况下,最好设置如下两个参数:
autoReconnect=true&failOverReadOnly=false
需要注意的是,在xml配置文件中,url中的&符号需要转义。比如在tomcat的server.xml中配置数据库连接池时,mysql jdbc url样例如下:
jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk
4. Mysql 的定时备份过程
mysql支持命令行导入导出数据文件,格式是*.sql
1)导入:
mysql -u用户名 -p密码 数据库名 < 文件路径\文件名
2)导出:
mysqldump -u用户名 -p密码 数据库名 > 文件路径\文件名
3)真实案例
本人是在windows 2003 开发服务器上,实现了定时自动备份
一般文件名,用日期和时间.sql来使用.下面是我的*.bat批处理文件
总共3行:
第一行,表示切换到d盘
第二行,找到mysql安装目录的bin目录,这样不需要设置环境变量
第三行,导出*.sql文件,同时使用当前时间作为文件名,格式如下:cold_20101026_1244.sql,表示cold数据库,在2010年10月26日,中午12点44分生成的备份文件
d:
cd D:\Program Files\MySQL\MySQL Server 5.1\bin
mysqldump -uroot -p123456 cold > d:\mysql_data\cold_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.sql
然后,将该批处理文件,加到windows任务计划中,
点击 控制面板>任务计划>添加任务计划。
顺便给出还原代码,还原的时候要首先手工建立数据库,默认情况下,是不会自动创建数据库的
d:
cd D:\Program Files\MySQL\MySQL Server 5.1\bin
mysql -uroot -p147258369 cold < D:\mysql_data\cold_20101026_1234.sql
注:oracle的备份,也可以这么实现,跨平台也是如此,需要把脚本加到任务计划中来。
5.mysql的性能优化使用技巧
在windows下,配置文件为%mysql_home%/my.ini
在linux下,配制文件为/etc/my.cnf
一 性能优化
1--------INNODB_BUFFER_POOL_SIZE
该参数是innodb引擎的最主要的性能参数,对数据库的性能起了决定性作用.说白了就是数据库的使用内存.
2--------性能分析,
show status like '%'; #查看数据库状态
show variables like %; #查看数据库的变量
show engine innodb status\G; #查看innodb的监控状态
二 使用技巧
1--------字符集尽量使用uft-8,这样更容易解决乱码问题,在linux下修改my.cnf的3处,修改前后可以通过命令
show variables like 'character%';
查看字符集状态.
找到客户端配置[client] 在下面添加
#默认字符集为utf8
default-character-set=utf8
在找到[mysqld] 添加
#默认字符集为utf8
default-character-set=utf8
#设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行
init_connect='SET NAMES utf8'
在实际中,有这样一个需求,就是需要统计24个小时的相关数据.有的朋友认为简单的一句group by就可以解决。其实不然,真正的统计,24个小时都得有数据的,不允许出现缺失的现象.其实这个有点像废话,处理结果集ResultSet也可以,但为了减少JAVA的负担和增强java代码的可读性,所以尽量用SQL语句,一次性把数据处理好.
表结构,有三个字段一看就明白
在存储过程中,动态拼接一个字符串,然后执行之.
一 物化视图
物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
只有大型数据库oracle10g,db2才支持这个功能,而MySQL5.1暂时还没有这个功能。本人通过事件调度和存储过程模拟了物化视图。下面大家一起来讨论吧。^-^
二 准备知识
1)存储过程:玩过数据库的人,都知道他是啥~,~
2)事件调度:在MySQL5.1开始才有的新功能。说白了就是个定时器。跟java里的timer差不多。
mysql默认不会启动event,所以需要修改你的my.ini或my.cnf[mysqld]的下面加入如下行
event_scheduler=1
三 模拟物化视图
1)先建个基表吧。
2)设计视图
我想查询所有18岁员工的数量。
很简单,select count(*) from user where age=18;
如果是传统概念的视图,在MySQL中,每次访问视图的时候,他都会创建个临时表,然后执行一次。在海量数据的情况下,这样的效率是非常低的。而物化视图,则他会定时去刷新这个临时表,而不是你在用的时候才会去刷新。并且物化视图的"临时表"是一直存在的。所以效率高出非常多。拿空间换时间^-^
3)创建"物化视图"的表
4)设计存储过程
5)设计调度并执行,为了使实验明显,我就把调度设置成5秒一次吧。周期可以自己调节。
四 总结
上面的实现,可能不太明显,但在海量数据处理的时候进行统计,性能有明显的提升。大家做实验的时候,可以增加一个insert语句,方便观察。在更新数据的时候,如果数据量大,则需要按下面步骤来处理
1)delete 1条记录
2)insert 1条记录
3)提交
如果一次性把数据全部删除,在查询的时候,有可能会出现空表的现象。而且会影响统计使用。
通过利用这个事件调度,定时备份的事情也同时解决了.
建议大家配合表分区,索引同时使用,这样可以提高性能.
未完成:在更新表的时候,需要采用某种算法来执行,这样才能提高性能,而不是单纯的删除再插入.
11.mysql中按月统计数据