2007-11-15
MySQL性能优化TIPS
关键字: MySQL 性能优化 TIPSMySQL性能优化TIPS
周三, 2006/09/20 - 21:30 — yejr
作/译者:叶金荣(Email:
),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
一. 启动参数优化
修改 my.cnf (或者my.ini),加入/修改以下几行
#设定缓存的连接数,节省连接时的开销 back_log = 64 #禁用文件系统外部锁 external-locking = 0 #禁用BDB,如果你确实不需要的话,innodb也是如此 skip-bdb #索引缓冲,如果是专用的数据库服务器,可以设置高达服务器内存的一半,如果不是专用的, #还是设置得低一点 key_buffer = 512M #缓存数据表数量,如果内存较大,可以设置稍微高一点,否则还是设置低一点 #设置这个参数可以参见系统状态中的 open_tables(表示当前打开的数据表总数) #和 opened_tables(表示所有打开的数据表总数) table_cache = 128 #禁用dns解析,如果你的授权信息中采用dns授权方式了,就不能启用该选项 skip-name-resolve #记录慢查询和没有使用索引的查询,便于帮助分析问题所在 long_query_time = 1 log-slow-queries = /usr/local/mysql/data/slow.log log-queries-not-using-indexes
其他参数诸如 sort_buffer_size,net_buffer_length,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size, 等请查询MySQL手册,然后做出合适的调整.
thread_cache_size,query_cache_size,max_binlog_cache_size
二. 其他小TIPS
- 针对Innodb表,尽量不执行
SELECT COUNT(*)语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢. - 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁.
- 善用
EXPLAIN来帮助你分析查询优化情况 - 如果需要对一个较大的且并发读写较多的数据表做
GROUP BY等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善. - 查询时如果有
ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度 - 如果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到.例如:
索引`idx_`(col1, col2, col3),那么查询SELECT .... FROM ... WHERE col1=1 AND col2=2;使用索引,而查询... WHERE col2=2 AND col3=3;或... WHERE col1=1 AND col3=3;则不使用索引. WHERE中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤.- 2 个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了.
- 大部分情况下,字符类型的字段索引值需要一部分,例如
CREATE INDEX char_idx ON tbl1 ( name(10) ); - 尽量使用最合适的数据类型,能使用
ENUM就不使用TINYINT,能使用SMALLINT就不使用MEDIUMINT.这样能节省存储空间,增加数据存储量,提高搜索速度.不要担心这样会对省级产生很大的影响,因为加入从TINYINT类型改变为INT的话,并不会改变原来的数据. - 如果知道某个表总是频繁使用的话,可以把它放到
hot_cache中,用以下方法:
SET GLOBAL hot_cache.key_buffer_size=128*1024; CACHE INDEX `xxx` IN hot_cache;
- 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能.
- 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率.如:
... WHERE `create_time` > UNIX_TIMESTAMP(NOW());这样的查询.可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句. - 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引.如
... `name` LIKE 'yejr%';. - 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高.
- 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗.
- 定期的在MyISAM表上执行
OPTIMIZE TABLE,这能整理随便,提高索引效率. - 如果你主要按 col1,col2,...顺序检索记录,请在对表大量更改后执行
ALTER TABLE ... ORDER BY col1, col2, ...语句,这可以获得更好的性能. - 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT).
- 对于记录总数超过500万的单表,就应该赶紧考虑分表了.分表策略有多种,比如按ID号段,或者按时间切分,等等.
- 创建数据表时尽量指定字段不能为NULL,并且有默认值.
- 使用
LOAD DATA,而不是使用大批量的INSERT语句来导入数据. - 使数据表名和字段名尽可能的短,例如在
user表中使用字段名name,而不是user_name. - 用
DELAY_KEY_WRITE = 1选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行myisamchk修复索引才行. - 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载.
评论
zczmfa
2007-12-18
[/size][sizcxCXce=12][/size][i][u][quote][code][list][img][/img][url][list=][size=9][color=darkred][/color]
发表评论
- 浏览: 36765 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
链接
- Hibernate Tag 参考手册(中文翻译版1.0)
- 闲聊日语张宏
- 《NeoSpeech语音合成英、中、韩、日朗读引擎》
- 《新版中日交流标准日本语广播讲座初级》同步更新,2006年6月5日,更新全部ISO文件,最后更新[MP3!]
- 《番茄花园 Windows All In One DVD 特别版》[ISO]
- 中 国 DOS 联 盟
- 新DOS时代
- 《虚拟工作站 6.0.1 Build 55017》(VMware Workstation 6.0.1 Build 55017)VMware Workstation 6.0.1 Build 55017
- 《经典2D即时战略游戏集》(Classic 2D-RTS Games Collection)完美硬盘版
- 标题: 关于DOS游戏在XP系统下运行的简单总结!, 新版VDMSound和DOSBox已经出炉啦!
- DOSBox / VDMSound常見FAQ
- D - F e n d 簡 單 教 學
- Get It Done with MySQL 5
- 《沪江日语原创作品资料集(新增交响情人梦)》(jp.hjenglish.com)合辑
- SQL语句教程 - 由范例学习SQL语句
- 飞奔·慢行
- 地铁换乘/时间/价钱
最新评论
-
一个老IT人的自白:看十年 ...
我不认同三星有多牛,说白了,我认为高丽棒子做的东西真的一般般
-- by xbwolf -
JavaTiger(Java5.0) 新特 ...
感谢分享,解决了我的困惑
-- by onwulc -
磨刀不误砍柴功—难忘的Ja ...
-- by wcj10051891 -
MySQL性能优化TIPS
[/size][sizcxCXce=12][/size][i][u][quote ...
-- by zczmfa -
JavaTiger(Java5.0) 新特 ...
很详细,学习了。
-- by 咖啡舞者






评论排行榜