当前位置:网站首页 > SQL数据库编程 > 正文

mysql自增主键和uuid(mysql自增主键缺点)



在实际项目中,主键id推荐使用数据库自增ID(类型为bigint)和雪花算法生成的随机ID。

业务量小,采用自增ID;业务量大,推荐采用雪花算法。

使用自增id的缺点:

1、自增id如果暴露,容易被人发现规律

2、对于高并发的情况下,innodb引擎在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点。

3、单表数据量达到一定程度后要分库分表,导致ID重复,解决起来比较麻烦

不要使用外键与其它表进行关联,避免高并发场景的性能问题

1、外键是极影响并发性能的,因为当存在外键约束的时候,MySQL会进行即时检查,每次insert和update都要要去扫描此记录是否满足

2、耦合度高,后期很难进行分库分表

数据库的资源是很宝贵的,合适的字段类型和长度,不但节约数据库表空间和节约索引存储空间,更重要的是提升检索速度

1、对于固定长度的坚决使用char/tiyint等类型

2、对于不固定长度但是确定了总长度的使用varchar类型

3、不要用varchar/char 存储长字符串,直接用text。并且让长字符串拆分到另一个表,保持主表尽量瘦小

允许适当冗余其他表的字段,以提高查询性能,但必须考虑数据一致而且不要冗余过长的字段

避免将字段默认值设为null

对于count和group场景,请使用覆盖索引,提高查询性能。

索引就像是一本书的目录,如果查询的内容都只和目录上的内容有关,那mysql只要扫描索引结构就能得到查询结果,比如我给student表增加了个索引:

用到索引覆盖的sql语句:

设计索引的时候尽量使用复合索引,并将区分度高的字段放在前面

那么什么是区分度高的字段呢?

执行如下语句,假设查询结果为 0.9,0.1,1000,可以看到name列的选择性最高,因此将其作为联合索引的第一列,即建立(name, gender)的联合索引

根据索引最左匹配原则,能够触发这个联合索引的sql语句是:

以下几个操作会引起索引失效:

1.在索引列上做计算、函数、转换类型等操作

2.违反最左匹配原则

3.like以通配符开头(例如:‘%喝水’)

4.防止隐式转换,比如:索引的字段为字符串类型,查询的时候不加单引号( name为vachar类型,查询的时候 where name = 1)

5.or连接,等等…

对于需要保证表中唯一的字段,即使在应用层做了校验,也必须建立唯一索引

注意:在性能上,唯一索引在查询时的性能要比非聚集索引高,但是在插入与更新时要比非聚集索引低

在长度较长的字段上建立索引时,必须指定索引长度,没必要对全字段建立索引

索引的长度与区分度是一对矛盾体,一般对于字符串类型的字段,设置索引的长度为 20,区分度会高达 90%以上,可以使用以下sql来确定区分度:

正式环境的数据库账号往往是没有delete权限的,避免误操作,删库跑路等等

并且update操作比delete性能高

虽然in的数量 MySQL 并没有做具体的限制,但对整个 SQL 语句的长度做了限制。 不要进行 in 大量数据集合的操作,若实在无法避免,可以分批次查询,一次in 一定数量集。

当我们使用关联查询的时候,用小表驱动大表的方式效率会提升很多。而 inner join 会自动的进行小表驱动大表的优化

避免使用触发器和存储过程,难以调试和扩展不说,更是没有可移植性,这些边缘功能最好不用。

mysql5.7对count(*) 进行了优化

所以现在 count( *)和count(1)的执行效率是一样的。

而count(字段)因为有sql解析的过程,不仅效率会慢,而且不会对null值进行统计

到此这篇mysql自增主键和uuid(mysql自增主键缺点)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • pymysql由于目标计算机积极拒绝(sqlserver由于目标计算机积极拒绝,无法连接)2025-02-08 07:09:09
  • sqlldr跳过某一列(sqlldr skip=1)2025-02-08 07:09:09
  • 增删改查sql语句例子(增删改查sql语句例子及解析)2025-02-08 07:09:09
  • mysql主键约束名(mysql的主键约束相当于唯一约束和什么约束的组合)2025-02-08 07:09:09
  • mysql导入sql文件过大(mysql数据库导入sql文件不成功解决办法!)2025-02-08 07:09:09
  • 数据库增删改查面试题(sql数据库增删改查操作面试)2025-02-08 07:09:09
  • sql文件怎么导入mysql数据库(把sql文件导入数据库)2025-02-08 07:09:09
  • 增删改查sql语句(增删改查sql语句面试)2025-02-08 07:09:09
  • sql循环语句(sql中循环)2025-02-08 07:09:09
  • sqlserver数据库基础知识(sql server数据库基础)2025-02-08 07:09:09
  • 全屏图片