MySQL把一个大表拆分多个表后如何解决跨表查询效率问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL把一个大表拆分多个表后如何解决跨表查询效率问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2079字,纯文字阅读大概需要3分钟。
内容图文
![MySQL把一个大表拆分多个表后如何解决跨表查询效率问题](/upload/InfoBanner/zyjiaocheng/874/e379067a26ad4497906f2848076d4dbe.jpg)
大表分表后每个表的结构相同,可以用sql的union。比如a,b表结构相同可以通过union来联接
select * from a union all select * from b where ...
1、Union和Union All到底有什么区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
比如一家公司在中美均有雇员,我们使用Union这个命令想查出中美所有雇员,是不行的。假如我们有两个名字相同的雇员,他们当中就只会有一个人被列出来了。UNION 命令只会选取不同的值。而Union All则可以查出全部的值。
详细了解:https://www.w3school.com.cn/sql/sql_union.asp
2、大表拆分后的查询效率问题
假如一个超级大的用户表按照数据拆分成10个表后,某个用户登录的时候是不是要从10个表里面去查询这个用户的用户名和密码是否正确。这样就存在效率问题。
一种方案就是拆表的时候,按照一定规则来拆表,查询的时候按照这个规则来查,通过规则就能知道到底该去哪个表查,如果胡乱拆表,那一个表和10个表有什么区别。
3、大表拆分
表的拆分分为横向拆分(记录的拆分)和纵向拆分(字段的拆分)。拆分表的目的:提高查询速度。
(1)横向拆分
我们从一个案例去解释,情景是这样的:某某博客,有50W的博客量,有2w的用户,发现随着用户和博客数的增加,查询速度日渐下降,现在要对博客表blog与用户表user进行优化。
表结构如下:
create table blog( bid title content pubtime uid ) 50万 create table user( uid username password nick ...... ) 2万
首先我们要决定根据哪个字段对记录进行拆分,查询决定了拆分,在这里我们根据uid字段对两个表进行拆分是比较合理的。
博客表根据uid去拆分: 1-5000------blog_1 5001-10000-----blog_2 10001-15000----blog_3 15001-20000----blog_4 人员表根据uid 等分: 1-5000------user_1 5001-10000-----user_2 10001-15000----user_3 15001-20000----user_4
比如查询某人的博客:
// 根据uid确认表名: $num=ceil(12345/5000); select uid,bid,title,pubtime from blog_$num where uid=12345;
(2)纵向拆分:把活跃字段(常用)、惰性字段(不常用)分开。
案例:比如人员表,活跃字段像用户名、密码、昵称等,惰性字段像手机号、邮箱、性别等不经常使用和修改的字段。
一张完整的用户表可以拆分为两张表,如下:
create table user( uid int key auto_increment, username char(20), password char(32) not null, nick char(10) ); create table user_ext( uid regtime name email qq phone sex )
内容总结
以上是互联网集市为您收集整理的MySQL把一个大表拆分多个表后如何解决跨表查询效率问题全部内容,希望文章能够帮你解决MySQL把一个大表拆分多个表后如何解决跨表查询效率问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。