时间:2021-07-01 10:21:17 帮助过:19人阅读
原贴:http://imysql.cn/node/124 MySQL性能优化TIPS 周三, 2006/09/20 - 21:30 yejr 作/译者:叶金荣(Email: ),来源:http://imysql.cn 一. 启动参数优化 修改 my.cnf (或者my.ini),加入/修改以下几行 #设定缓存的连接数,节省连接时的开销 back_log= 64
原贴:http://imysql.cn/node/124作/译者:叶金荣(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
SELECT COUNT(*)
语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢.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
),就尽量放在前面,这样能更快的执行过滤.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语句. ... `name` LIKE 'yejr%';
.OPTIMIZE TABLE
,这能整理随便,提高索引效率.ALTER TABLE ... ORDER BY col1, col2, ...
语句,这可以获得更好的性能.LOAD DATA
,而不是使用大批量的 INSERT
语句来导入数据.user
表中使用字段名 name
,而不是 user_name
.DELAY_KEY_WRITE = 1
选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行 myisamchk
修复索引才行.参考文档 MySQL 手册