mysql处理亿级数据问题
我业务要求是:能按本机号码,查找到所有联系人号码按某个联系人号码,查找所有保存了该联系人的手机号码我现在是这样设计数据库的一张表有3个字段,主键自增idint(10),本...
我业务要求是:
能按本机号码,查找到所有联系人号码
按某个联系人号码,查找所有保存了该联系人的手机号码
我现在是这样设计数据库的
一张表有3个字段,主键自增id int(10), 本机号码phoneNumber varchar(20),联系人号码contantNumber varchar(20)。
作用是这样的,比如说手机A有B、C、D联系人,那么表中就存
1 A B
2 A C
3 A D
三条数据,假如每个手机有100个联系人,100万个手机就有1亿条数据了。
这查询起来肯定很慢,我是新手,请问大神们有没有好的办法,或者好的设计方案
补充:可能我没说清楚重点,查询的那块优化我知道一点
主要是我想从设计方案上能不能优化
我昨天查了一天资料,所的好多什么分区,分库什么的
关键是如果我分区的话,只能顾及一种查询,另一个查询的结果可能就在2个不同的分区里了
这样还是效率不高。 展开
能按本机号码,查找到所有联系人号码
按某个联系人号码,查找所有保存了该联系人的手机号码
我现在是这样设计数据库的
一张表有3个字段,主键自增id int(10), 本机号码phoneNumber varchar(20),联系人号码contantNumber varchar(20)。
作用是这样的,比如说手机A有B、C、D联系人,那么表中就存
1 A B
2 A C
3 A D
三条数据,假如每个手机有100个联系人,100万个手机就有1亿条数据了。
这查询起来肯定很慢,我是新手,请问大神们有没有好的办法,或者好的设计方案
补充:可能我没说清楚重点,查询的那块优化我知道一点
主要是我想从设计方案上能不能优化
我昨天查了一天资料,所的好多什么分区,分库什么的
关键是如果我分区的话,只能顾及一种查询,另一个查询的结果可能就在2个不同的分区里了
这样还是效率不高。 展开
2个回答
展开全部
什么?你联系人存成三条记录? 宝贝你这样是嫌数据不够少是吗?
还有表里面column名请用下划线。联系人是contact不是contant
你每一个联系人都有一个id对吧,你看你的表里有id, phone_number, contact_name。
你再加一个column联系人contact_ids,所有联系人id用逗号分开。
现在就是id, phone_number, contact_name, contact_ids
表中应该是这样的
id | phone_number | contact_name | contact_ids
1 | 80008001 | Foo | 2, 3, 4|
2 | 80008002 | Bar | 1, 3, 4|
3 | 80008003 | Baz | 1, 2, 4|
4 | 80008004 | Qux | 1, 2, 3|
这样你取一个名字叫做Foo的联系人名单的时候会拿到 String "2,3,4",你把这个String.split 就得到所有联系人id了。
这样如果你有100万个联系人,每个人有100个电话号码,表里面还是有100万条记录,但是储存了1亿条信息。
会了吗?
还有表里面column名请用下划线。联系人是contact不是contant
你每一个联系人都有一个id对吧,你看你的表里有id, phone_number, contact_name。
你再加一个column联系人contact_ids,所有联系人id用逗号分开。
现在就是id, phone_number, contact_name, contact_ids
表中应该是这样的
id | phone_number | contact_name | contact_ids
1 | 80008001 | Foo | 2, 3, 4|
2 | 80008002 | Bar | 1, 3, 4|
3 | 80008003 | Baz | 1, 2, 4|
4 | 80008004 | Qux | 1, 2, 3|
这样你取一个名字叫做Foo的联系人名单的时候会拿到 String "2,3,4",你把这个String.split 就得到所有联系人id了。
这样如果你有100万个联系人,每个人有100个电话号码,表里面还是有100万条记录,但是储存了1亿条信息。
会了吗?
追问
一开始用redis实现的时候就是这么考虑的
但是第二个要求:“按某个联系人号码,查找所有保存了该联系人的手机号码”不好操作啊
还有插入的时候,那个contact_ids都是未知的
追答
按某个联系人(Baz, id=3)号码,查找所有保存了该联系人的手机号码
Oracle:
select * from contact
where contact_ids like '%,3,%'
插入新联系人的时候,那个contact_ids都是未知的
写一个java方法就可以解决了
Java mock run code:
public insertNewContact(newContact){
//数据库拿目标user的所有contacts
database.get(contact.ids)
//如果存在就不操作
if(contact.ids.exist(newContact.id))
return
//如果不存在就插入新联系人
database.addNewContact(newContact, contact)
}
展开全部
你这个牵扯到数据库的优化,不是一两句话就能解决的,但总的说,mysql数据库优化有下面几个方面:
(1)选取最适合的字段属性,尽量把字段设置为NOT NULL,这样在执行查询的时候,数据库就不用去比较NULL的值。
(2)使用连接(JOIN)来代替子查询(Sub-Queries)
(3)使用联合(UNION)来代替手动创建的临时表
(4)尽量少使用LIKE关键字和通配符(极耗时间)
(5)使用事务和外键
(1)选取最适合的字段属性,尽量把字段设置为NOT NULL,这样在执行查询的时候,数据库就不用去比较NULL的值。
(2)使用连接(JOIN)来代替子查询(Sub-Queries)
(3)使用联合(UNION)来代替手动创建的临时表
(4)尽量少使用LIKE关键字和通配符(极耗时间)
(5)使用事务和外键
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询