最近数据库老是出现问题,查了好多资料才搞定。请问各位如何在不增加硬件的前提下,大幅度优化mysql 的性能呢?大家的经验是?例如要修改mysql里面的哪些参数?用的是lnmp。
最近数据库老是出现问题,查了好多资料才搞定。请问各位如何在不增加硬件的前提下,大幅度优化mysql 的性能呢?大家的经验是?例如要修改mysql里面的哪些参数?用的是lnmp。
从这几个方面入手
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.如果数据量不大,建议还是全表扫比较快,因为毕竟索引也有成本。
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.2k 阅读✓ 已解决
2 回答2k 阅读
3 回答2k 阅读
装5.5版本的mysql占用1G主机的4.6%内存,几乎不怎么占用
但是5.7版本的超占内存。我已经卸载了