2023年7月27日发(作者:)
MySQL数据库设计⽤户表需求做⼀个展⽰⽤户信息的页⾯,有⼀个users表,⾥⾯该有的信息都有。性能要求数据量30亿。页⾯必选条件:性别(男/⼥), 昵称前缀, 年龄。查询条件⼀定会带上这三个条件。每页展现10条记录。⼤翻页需求,如查第80w页。尽可能的⾼性能按注册时间倒序展现设计思路没有标准答案,可以考虑各种⽅案,⼤家⼀起来讨论好的解决⽅案~分表⽅式怎么分表呢?⽤出⽣时间分表每1年建⼀个表。查年龄的时候,如,查2岁的。今天是2019-11-08,就要查出⽣⽇期在 2016-11-08 ~ 2017-11-08 的数据。按年建表的话就要查2个表T_2016 和T_2017查完需要在应⽤层做merge。(这个操作会⽐较⿇烦,如查第80页数据(800w-800w+10),需要按相同的查询条件在两个表都拿10w条数据出来做merge,看到底merge完之后哪些才是800w ~ 800w+10的数据)是否能每两年建⼀个表(T_2016_2017, T2017_2018)呢?这样就可以避免merge查询。不过会有双写和重复问题。也算是⼀个解决⽅案?联合所有条件分表性别+昵称前缀+出⽣年份如: hash(“男_陈_2016_2017”)输⼊条件: 男 陈 2岁, 直接能定位到这个表这个单表⾥⾯包含的数据: 所有男性,陈开头,2岁的数据。单表建联合索引(注册时间,昵称)【为了保证注册时间有序】⼤分页的时候:⽤户输⼊ 男 陈 2岁 limit 800w, 10下午做个实验试试!做个实验设计数据表create table t_male_chen_9899 (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(20) NOT NULL COMMENT 'name',`birthday` varchar(8) NOT NULL COMMENT 'birthday',`register_time` int(11) NOT NULL COMMENT 'register_time',PRIMARY KEY(`id`),INDEX `registertime_name_idx` (`register_time`, `name`))ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="test_male_chen_9899";批量插⼊数据import randomdef randstr(num=None): # 猜猜变量名为啥叫 H H = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' salt = '' if num is None: num = t(1, 9) for i in range(num): salt += (H) return saltdef randtime(): # 06-17年 return t(1136044800, 1514736000)def randbirth(): # 1998-2000年 randint = t(883584000, 946656000) date_touple = ime(randint) return me("%Y%m%d", date_touple)db = Mysql(_CONF['host'], int(_CONF['port']), _CONF['user'], _CONF['pswd'], _CONF['db'], debug=0)tb_name = 't_male_chen_9899'start = ()print 'start', startMAX_LINE = 10000000for i in range(MAX_LINE): data = { "name": "陈" + randstr(), "register_time": randtime(), "birthday": randbirth() } ret = (tb_name, data) if i % 10000 == 0: print i, float(i) / MAX_LINE * 100, "%", (data)end = ()print 'end', endtimepass = end - startprint 'timepass', timepass, s按照需求,查询数据:explain select * from t_male_chen_9899 where birthday between "19981108" and "19991108" and name like "陈%" order by register_time desc limit 100000, 10;没有⽤到索引,2.73s,还是会慢。。这是因为昵称的前缀索引 和 birthday的范围索引 没法⼀起⼯作。⼩总结综上所述,我是真的想不到完美的解决⽅案了
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690431514a348953.html
评论列表(0条)