请教大家如何优化低内存(例如 512mb 或者 1gb)vps 上的 mysql 数据库

最近数据库老是出现问题,查了好多资料才搞定。请问各位如何在不增加硬件的前提下,大幅度优化mysql 的性能呢?大家的经验是?例如要修改mysql里面的哪些参数?用的是lnmp。

阅读 5.2k
3 个回答

装5.5版本的mysql占用1G主机的4.6%内存,几乎不怎么占用
但是5.7版本的超占内存。我已经卸载了

从这几个方面入手
1.建立一些有效的索引,索引是比较影响查询速度的,它可以快速的定位到你要查询的数据,如果有多个条件的话可以建立联合索引,但要注意联合索引的顺序,比如有一个这样的索引,有以下这些字段,(user_id,type_id,views (浏览次数))当我们写查询语句的时候,mysql会从左往右匹配索引。比如我们这么写 (加入表名叫post)
select * from post where user_id = 1 and views > 2 ,如果这样的话,我们的索引只匹配到了user_id 就不匹配了,因为mysql只能顺序的匹配索引。索引的顺序也很重要,一般是将区分度比较高的索引放在最左侧,比如 上边的例子,因为一个网站里用户的数量正常来说会比类型的数量要多很多,所以用户id的区分度比较高。
2.如果实在是无法避免条件确实不够,比如上例子确实只需要这两个条件(user_id,views),如果是这两个,mysql就只能匹配user_id,而type_id 无法匹配,由于type数量并不多,那么我们可以在语句中加入 and type in(此处填写所有类型id,当然如果类型特别多就不要这么干了)。这样的话,建立的索引就能全部匹配。
3.尽可能的用合适的数据类型来表示数据,定长的数据char要比varchar优秀,如果表示状态的话tinyint要比int好。
4.如果数据量特别多,需要统计条数的话,如果不是需要非常精确的数字 explain 的row 是比较快的方式,它比count要快。
5.切分查询,比如,有这样一个需求。查询出所有文章(post),并且包含作者的名字也就是user_name ,一般的话,我们会想到去连表,但我们可以把这个查询切分开来,先用一个sql查询出所有文章,再通过代码拿到所有user_id,然后用in去user表中查询,最后将查询的结果合并,这么做虽然有些麻烦,但有时会是比较快的选择,因为,当我们将查询分开的时候,如果此前有程序做过同样的查询,mysql就不会执行一遍查询语句,而是会直接从缓存里取数据。
6.如果数据量不大,建议还是全表扫比较快,因为毕竟索引也有成本。

要先确定性能瓶颈到底在哪里,再来谈优化!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题