当前位置: 首页 > news >正文

mysql 单表字段多少合适_公司DBA关于MySQL开发的一点经验

尽量不要让数据库做过多运算

数据库主要是用来存储的,我们应避免让数据库做运算,比如写定时任务,存储过程等。复杂的计算应该在程序代码中实现。我们应该尽量简单的使用数据库。

控制数据量

一年内单表数据量一般含char不超过500W条,我们需要合理的分表。单个库的表建议在300到400之间。

单表字段数量

单表的字段应该少而精,那多少合适呢?一般单表字段上限控制在20到50个。

在开发中,我们要注意避免使用大SQL、大事务。

避免使用NULL字段

我发现很多童鞋在建表时喜欢字段默认NULL,使用NULL很难进行查询优化,我们如果对NULL列加索引,需要额外空间,而且含NULL的符合索引无效。

`a` char(32) DEFAULT NULL`b` int(10) NOT NULL

比如上面这种。

少用TEXT

我们可以使用VARCHAR代替TEXT,因为TEXT类型处理性能比VARCHAR要低,TEXT会强制生成临时表,从而浪费更多空间。UTF-8下,VARCHAR(65535)大概占用64K空间。

如果一定要使用,就拆成单独的一张表吧。

CREATE TABLE t1 (    id INT NOT NULL AUTO_INCREMENT,    data text NOT NULL,    PRIMARY KEY (id)) ENGINE=InnoDB;

关于索引

索引数量建议

索引虽然能改善查询,但如果索引列更新频繁,索引维护也会成为负担。我们如果不加索引就尽量不要加,最好不要超过字段数的20%。

关于函数运算

不要在索引列进行数学运算或者函数运算,因为这样会使索引失效。

-- 不要这样用select * from table WHERE to_days(current_date) – to_days(date_col) <= 10
-- 推荐使用select * from table WHERE date_col >= DATE_SUB('2011-10-22',INTERVAL 10 DAY);

自增列做主键

自增列做主键,有利于索引维护,并且主键不应该平繁修改。别用字符串做主键,比如不要使用UUID做主键。

推荐用独立块业务的AUTO_INCREMENT列或全局ID生成器做代理主键。

我们知道,InnoDB中,主键索引默认是以主键列创建的,那么问题来了。

如果没有指定主键,那么还会创建主键索引么?

尽量少使用外键

如果使用了外键,高并发下面容易产生死锁。我们应该由程序来保证约束。

SQL语句要简单

我看过好几百行的SQL,我认为这样不太好,一般一条SQL只能在一个CPU中运算,一条大SQL可能把数据库搞崩。

我们应该将大SQL拆成多条简单的小SQL,简单的SQL会使缓存命中率更高。

关于事务

我们应该尽量将与事务无关的操作放到事务外面,这样能减少锁资源的占用。

简单的使用

我们尽量少使用存储过程,触发器,尽量少用MySQL函数处理结果。数据的运算应该交由程序去操作。

关于SQL效率

改写OR为IN()

同一字段,将or改写为in()

  • OR效率:O(n)
  • IN 效率:O(Log n)
  • 当n很大时,OR会慢很多
Select * from table WHERE phone='12347856' or phone='42242233';-- 推荐使用inSelect * from table WHERE phone in ('12347856' , '42242233')

不同字段,将or改为union

Select * from table WHERE phone='010-88886666' or cellPhone='13800138000';-- 推荐使用 unionSelect * from table WHERE phone='010-88886666'unionSelect * from table WHERE cellPhone='13800138000';

用UNION ALL 而非 UNION

使用UNION会有去重开销。

关于JOIN

很多童鞋喜欢使用JOIN来连表查询,阿里巴巴开发手册里就建议不要超过三表的JOIN。

9c0657ccfe9570c4b03c22ce36fa0a7b.png

建议将表拆分。

Select * from tag JOIN tag_post on tag_post.tag_id=tag.id JOIN post on  tag_post.post_id=post.id WHERE tag.tag='二手玩具';

推荐这样做:

Select * from tag WHERE tag='二手玩具';Select * from tag_post WHERE tag_id=1321;Select * from post WHERE post.id in (123,456,314,141)

关于计数统计

  • 实时统计:用memcache,双向更新,凌晨跑基准
  • 非实时统计:尽量用单独统计表,定期重算

关于limit分页

我们平常可能写过这样的SQL:

Select * from table limit 10000,10;

但是这样会很慢,偏移量越大越慢。

我们推荐使用这样的方式

select * from table WHERE id>=23434 limit 11;

网上有人做了测试:

710d8374a51cbc866c4a45c378a9213f.png

不要在程序端对数据库显示加锁

“外部锁对数据库不可控高并发时是灾难极难调试和排查”

相关文章:

  • python性能测试脚本_精通Python自动化脚本-第二章 Python脚本调试和性能测试
  • python rindex_Python index和rindex方法
  • lcd图片转二进制工具_用完即走丨无需安装!900+工具在线使用,真正的NICE TOOL!...
  • fastjson jsonobject 转bean失败_漫谈FastJSON
  • vs 堆栈保留大小_亚冠杯:上海申花vs东京FC【绝密情报】
  • python文件名可以用中文吗_在文件名中可以使用“/”吗?
  • idea打开项目xml的路径飘红_从零开始搭建SpringBoot项目(小白版,踏遍万水千坑)...
  • docker 安装nginx_docker安装nginx镜像
  • 概率神经网络_深度学习算法(第33期)强化学习之神经网络策略学习平衡车
  • vasp 安装_安装Atomic Simulation Environment (ASE)
  • fastreport调用frf文件直接打印_不是我吹,20M的压缩文件我只用了1秒!
  • python属于哪类型的编程语言_python属于什么类型的语言
  • python excel接口测试_利用python和excel 搭建接口测试框架
  • sql 日期月转换到日_速来!9月新增雅思考点、考试日期(更新至8月16日)
  • python处理csv文件 pandas_Pandas操作CSV文件的读写实现方法
  • 收藏网友的 源程序下载网
  • $translatePartialLoader加载失败及解决方式
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 08.Android之View事件问题
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • C++11: atomic 头文件
  • JavaScript 奇技淫巧
  • js继承的实现方法
  • React as a UI Runtime(五、列表)
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 创建一个Struts2项目maven 方式
  • 大型网站性能监测、分析与优化常见问题QA
  • 前端js -- this指向总结。
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • $.ajax()参数及用法
  • $.ajax,axios,fetch三种ajax请求的区别
  • (4.10~4.16)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计高校学生选课系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (九)One-Wire总线-DS18B20
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET文档生成工具ADB使用图文教程
  • /*在DataTable中更新、删除数据*/
  • [AIGC] 如何建立和优化你的工作流?
  • [C#]DataTable常用操作总结【转】
  • [ccc3.0][数字钥匙] UWB配置和使用(二)
  • [iOS]-网络请求总结
  • [Linux打怪升级之路]-信号的保存和递达
  • [Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法
  • [MSSQL]GROUPING SETS,ROLLUP,CUBE初体验
  • [NET].NET Framework 3.5 SP1 真正的离线安装(转)