MySQL服务维护笔记 续
2007-11-11 15:18:20 来源:WEB开发网全文检索:如果相应字段没有做全文索引的话,全文检索将是一个非常消耗CPU的功能,因为全文检索是用不上一般数据库的索引的,所以要进行相应字段记录遍历。关于全文索引可以参考一下基于Java的全文索引引擎lucene的介绍。
前台应用的记录缓存:比如一个经常使用数据库认证,如果需要有更新用户最后登陆时间的操作,最好记录更新后就把用户放到一个缓存中(设置2个小时后过期),这样如果用户在2个小时内再次使用到登陆,就直接从缓存里认证,避免了过于频繁的数据库操作。
查询优先的表应该尽可能为where和order by字句中的字段加上索引,数据库更新插入优先的应用索引越少越好。
总之:对于任何数据库单表记录超过100万条优化都是比较困难的,关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。
一次优化实战
以下例子是对一个论坛应用进行的优化:
用Webalizer代替了原来的通过数据库的统计。
首先通过TOP命令查看MySQL(和PHP搭配之最佳组合)服务的CPU占用左右80%和内存占用:10M,说明数据库的索引缓存已经用完了,修改启动参数,增加了-O key_buffer=32M,过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M,数据库缓存才基本能充分使用。对于一个数据库应用来说,把内存给数据库比给WEB服务实用的多,因为MySQL(和PHP搭配之最佳组合)查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。
用show processlist;统计经常出现的SQL:
每分钟运行一次show processlist并记录日志:
* * * * * (/home/MySQL(和PHP搭配之最佳组合)/bin/MySQL(和PHP搭配之最佳组合) -uuser -ppassword < /home/chedong/show_processlist.sql >> /home/chedong/MySQL(和PHP搭配之最佳组合)_processlist.log)
show_processlist.sql里就一句:
show processlist;
比如可以从日志中将包含where的字句过滤出来:
grep where MySQL(和PHP搭配之最佳组合)_processlist.log
如果发现有死锁,一定要重新审视一下数据库设计了,对于一般情况:查询速度很慢,就将SQL where字句中没有索引的字段加上索引,如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询,考虑以后禁用和使用全文索引加速。
还是根据show processlist;看经常有那些数据库被频繁使用,考虑将数据库拆分到其他服务端口上。
mssql(WINDOWS平台上强大的数据库平台)到MySQL(和PHP搭配之最佳组合)的数据迁移:ACCESS+MySQL(和PHP搭配之最佳组合) ODBC Driver
在以前的几次数据迁移实践过程中,我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具,也不是mssql(WINDOWS平台上强大的数据库平台)自身的DTS进行数据迁移(迁移过程中间会有很多表出错误警告),但通过将mssql(WINDOWS平台上强大的数据库平台)数据库通过ACCESS获取外部数据导入到数据库中,然后用ACCESS的表==>右键==>导出,制定ODBC,通过MySQL(和PHP搭配之最佳组合)的DSN将数据导出。这样迁移大部分数据都会非常顺利,如果导出的表有索引问题,还会出添加索引提示(DTS就不行),然后剩余的工作就是在MySQL(和PHP搭配之最佳组合)中设计字段对应的SQL脚本了。
更多精彩
赞助商链接