数据库数据太多,多表检索非常缓慢,有什么好的解决办法么?
用了 view,没有什么改善,哪位有好的办法,谢谢了。
反模式,冗余,建缓存表,对那种读占多数的情况很适用。
比如一个 post 有用户 id,如果要找出用户名,要联查用户表,这时候建立一个用户名字段,在早期生成 post 的时候就写进去,这样显示 post 就不用联查 用户表了。
数据一致性通过程序保证,比如改用户名,那就要在其它有用户名字段的地方也要相应修改。
1、在设计之初,考虑数据增长趋势,建立合适的索引。 2、表关联的外键建立索引。 3、建立一些冗余数据,来避免 join 查询
和 @peter 所说的一样
比如两个表 deals
(tb_shop_id) 和 tb_shops
(wangwang, name.....) 。经常有这种需求,根据 wangwang
去查询deals
数据
一般写法
SELECT deals.*
FROM deals INNER JOIN tb_shops ON deals.tb_shop_id = tb_shops.id
WHERE tb_shops.wangwang='xxxxxx'
但是,如果在设计之初,考虑到这种需求,那么在表 deals
上记录 tb_shop_id 和 wangwang,那么就不需要 join 表查询了。
只有在 tb_shops.wangwang 修改的时候同步 deals
表
如下:
SELECT deals.*
FROM deals
WHERE deals.wangwang = 'xxxxxx'
4、数据库良好的设计,一定要,所见及所得,避免复杂的查询。 比如日志表,xxxx_logs 可能会有百万或千万的数据。那么避免对这个表做任何查询。可以根据需求建立几个小的统计表。 比如,商家每天的消费情况,商家的总消费情况,所有的数据在存入 xxxx_logs 的时候,对应把数据同步到这几个小表中。
商家每日消费情况表tb_shop_day_details
,商家总消费情况tb_shops_total_details
比如查看所有商家的总消费情况,只需要查询 tb_shops_total_details
不再需要从 xxxx_logs
临时计算数据,返回。
比如,要查看商家2014-11-11那一天消费的情况,那么也只需要
SELECT *
FROM tb_shop_day_details
WHERE st_date = '2014-11-11'
所有数据所见及所得,那么这种情况就不需要 JOIN 表操作。
5、将多表的数据查询,提前汇总到一个表。在真正需要查询的时候,从该汇总表中查询。
6、读写分离。在主库写,从库读。
7、将多表 join 查询,改成几条简单的 SQL 查询,最后在组合数据。
8、如果觉得上述的太麻烦,使用 solr 吧,但是原理是一样的,将预计要查询的汇总在一个表。
其实多表查询慢,第一、没有建立合适的索引,第二,存在不良的表结构设计。 在系统初期,没有做好设计。导致数据增长不可控,不良的表结构设计,肯定会导致多表查询慢。 要解决多表查询缓慢的问题,从修改表结构开始,一步一步优化,肯定能达到预期的效果。
@MrPasserby 产品是开发的死对头。一般遇到这种问题,都会详细的了解需求,确定是否要该表结构。 一般遇到这种频繁修改表结构的需求,至少都会在我这边自动屏蔽。
SO,一个好的产品,很关键。