MySQL多次select还是一次join

数据量偏大的话, 直接join,一下就卡死了。用from子查询 去限制 join的次数,因为是分页的,其实不用join全表,被join的那张表,往往也是不需要 join那么多数据,降低了join的次数(left join子查询),你join两张也好,四张也好,表里面几十万数据也好,都不会卡了, 订单表,只需要join 成功的订单,不需要对比 不成本的订单,要限制join的次数 或者有时候咱们只需要join 分页的十条数据. by-坑货亲测 – 2018年3月21日16:24:04


实验-四表关联查询-需要爬1万 10万 100万 数据对比.

相关资料

SQL 使用 Join 好还是多次 Select 好?

char与varchar

对于char与vafchar停留于一个定长和变长的概念中, 且还以为varchar是可自动变长.


如何可以查看到存储后值的长度?

varchar

可变长:指定长度后可系统自动计算存入的长度, 字符存入的长度不能超过指定的长度. eg: nickname varchar(5) 值1: abc 那么此时长度为3 值2:abcefg 超出部分g是无法存入的.
长度上加1字符: 每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)

  • 大于varchar(255)变为 tinytext
  • 大于varchar(500)变为 text
  • 大于varchar(20000)变为 mediumtext

char

定长: 定好字段长度后不管存入的字符多少占用的长度都是一样的. eg: nickname char(3) 值1: ac 占用长度为3 值2: abc 占用长度为3

差异与共同点

  • char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节
  • char的上限为255字节,varchar的上限65535字节,text的上限为65535
  • char在存储的时候会截断尾部的空格,varchar和text不会
  • varchar会使用1-3个字节来存储长度,text不会
  • char效率比varchar高
  • varchar比char节省空间-但不节省内存

查阅资料

MySQL之char、varchar和text的设计 文章写很清晰有各个属性占用字符长度的表格及分析了varchar与text性能与空间对比
mysql中char与varchar的区别分析 有关于存储引擎的建议
MySQL中varchar与char类型区别 提及到4.1与5.0之后版本对空格处理的不同, 关于内存使用情况 有对空格处理情况重现的实例
数据库字段类型中char和Varchar区别 一篇比较久远的文章, 提到了 varchar2 及 ASCII 占用大小

[转]数据库外键

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:

  1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.传统行业
1>.软件应用的人数有限,换句话说是可控的;
2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;

综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;
最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用。

以上内容转自知乎-大家设计数据库时使用外键吗

MySQL表结构及开发数据同步方法

结构同步

方法一: 线上建独立开发库-适合团队
– 每次有表结构变动都提交到指定的人-然后更新到开发库中
– 每次开发前先同步开发库的表结构

方法二: 本地文件夹-适合个人

____________________
|--alterUpdate.sh
|--full
|--20180203
|--|--alter.sql
|--|--lock.mysql
|--20180206
|--|--alter.sql
|___________________

如果有更新结构语句, 侧以当天日期建立sql脚本.
每次开发前先执行alterUpdate.sh脚本, 脚本先判断所有日期的文件夹里面是否都有lock.mysql如果全部有侧直接执行full的sql脚本,
如果有日期文件夹中的没有lock.mysql侧先执行然后生成lcok.mysql再导出数据库全部结构语句, 再覆盖到full中的sql脚本里.

数据同步

开发的时候有些配置数据和分类的数据需要预先存入数据库的.

  • 自动增加不可用来做更新条件判断

场景: 页面需要获取”手机-小米”下的所有产品. 现在在分类增加一条小米的分类数据.

分类表结构: id pid title name, 关键字段 name 字符串-英语组合-不可重复

同步规则: 先判断小米的name是否存在, 再获取手机的id,做为准备插入小米分类数据的pid

github-tag包下载很慢处理方法

eg: https://github.com/mysql/mysql-server/tags 下载MySQL的源码包

方法一: 通过搜索最近的DNS服务器

下载会转到 github-cloud.s3.amazonaws.com 这服务器下载, 站长之家-DNS查询 离我们最近的服务器, 然后把IP粘贴到本机的HOSTS文件中.

52.216.20.16 github-cloud.s3.amazonaws.com

方法二: 把github导出然到国内的git平台中下载.

eg: 利用码云的git平台, 导入后再tag中下载包

相关资料

mysql-社区版下载