首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

大佬都在用的数据库设计规范!你不点进来看看嘛?

; 即使c的区分度更高,也必须要将d放在索引的最前列,即索引idx_d_c 要注意防止因为字段类型不同造成隐式转换,导致索引失效 创建索引有以下错误的观点: 认为一个查询就需要建一个索引 认为索引会消耗空间...) 如果其中一列全为NULL, 那么即使另一列有不同的值,也返回0 当某一列的值全是NULL时, count(NULL)的返回结果为0,但sum(col)返回结果为NULL, 因此使用sum要注意NPE...NULL: NULLNULL的返回结果是NULL,而不是false NULL==NULL的返回结果是NULL,而不是true NULL1的返回结果是NULL,而不是true 在代码中写分页逻辑时...则为外键 如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为级联更新 外键与级联更新适用于单机低并发,不适合分布式,高并发集群 级联更新是强阻塞,存在数据库更新风暴的风险...resultClass当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义,每一个表一定有一个POJO类对应 配置映射关系,使字段与DAO类解耦,方面维护 Sql.xml配置参数使用 #{ }

48320

缓存内功心法:缓存基础整理

所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。 解决方法: 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。...,在数据库没有,自然在缓存中也不会有。...这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。...解决方案: 布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。...如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

68530
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL战记:Count( *)实现之谜与计数策略的选择

    MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。...因此,MySQL 优化器会找到最小的那棵树来遍历。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。...因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。...但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...在数据库保存计数根据上面的分析,用缓存系统保存计数有丢失数据和计数不精确的问题。那么,如果我们把这个计数直接放到数据库里单独的一张计数表 C 中,又会怎么样呢?

    9510

    3. java缓存-线程内缓存guava cache

    范例 手动加载缓存 手动加载缓存:需要提前把数据put,当数据不存在返回null public class MyCache { private static Cache<String,Object...name11 dadad dadad remove 1:name11 ------------------ 上述缓存就可以看做是一个手动加载数据的缓存,即使用前自己手动的加载完成数据,当然也可以调用特殊的方法...自动加载缓存 自动加载缓存:不需要提前加载数据,当get时,不存在数据,会自动根据CacheLoader加载数据。...private static User getUserInfoFromDB(String key) { if("123".equals(key)){ //模拟数据库中不存在的数据...不允许null get时,key不存在返回null,返回null。 get时,key存在,缓存的value不为null,返回非null值。

    85850

    SQL 优化极简法则,还有谁不会?

    同理,我们应该避免使用 SELECT * FROM, 因为它表示查询表中的所有字段。这种写法通常导致数据库需要读取更多的数据,同时网络也需要传输更多的数据,从而导致性能的下降。 ?...即使创建了合适的索引,如果 SQL 语句写的有问题,数据库也不会使用索引。...对于大型文本数据的模糊匹配,应该考虑数据库提供的全文检索功能,甚至专门的全文搜索引擎(Elasticsearch 等); 如果 WHERE 条件中的字段上创建了索引,尽量设置为 NOT NULL;不是所有数据库使用...;因为即使我们只需要返回 10 条记录,数据库仍然需要访问并且过滤掉 N(比如 1000000)行记录,即使通过索引也会涉及不必要的扫描操作。...这是因为左外连接会返回左表中的全部数据,即使 ON 子句中指定了员工姓名也不会生效;而 WHERE 条件在逻辑上是对连接操作之后的结果进行过滤。

    1.2K20

    SQL 优化极简法则,你掌握几个?

    同理,我们应该避免使用 SELECT * FROM, 因为它表示查询表中的所有字段。这种写法通常导致数据库需要读取更多的数据,同时网络也需要传输更多的数据,从而导致性能的下降。...即使创建了合适的索引,如果 SQL 语句写的有问题,数据库也不会使用索引。...对于大型文本数据的模糊匹配,应该考虑数据库提供的全文检索功能,甚至专门的全文搜索引擎(Elasticsearch 等); 如果 WHERE 条件中的字段上创建了索引,尽量设置为 NOT NULL;不是所有数据库使用...;因为即使我们只需要返回 10 条记录,数据库仍然需要访问并且过滤掉 N(比如 1000000)行记录,即使通过索引也会涉及不必要的扫描操作。...这是因为左外连接会返回左表中的全部数据,即使 ON 子句中指定了员工姓名也不会生效;而 WHERE 条件在逻辑上是对连接操作之后的结果进行过滤。

    1.1K10

    SQL优化极简法则,还有谁不会?

    同理,我们应该避免使用 SELECT * FROM, 因为它表示查询表中的所有字段。 这种写法通常导致数据库需要读取更多的数据,同时网络也需要传输更多的数据,从而导致性能的下降。...将 GROUP BY 分组操作字段加入到索引中,可以利用索引完成分组。 即使创建了合适的索引,如果 SQL 语句写的有问题,数据库也不会使用索引。...如果 WHERE 条件中的字段上创建了索引,尽量设置为 NOT NULL;不是所有数据库使用 IS [NOT] NULL 判断时都可以利用索引。...;因为即使我们只需要返回 10 条记录,数据库仍然需要访问并且过滤掉 N(比如 1000000)行记录,即使通过索引也会涉及不必要的扫描操作。...这是因为左外连接会返回左表中的全部数据,即使 ON 子句中指定了员工姓名也不会生效;而 WHERE 条件在逻辑上是对连接操作之后的结果进行过滤。

    1K20

    缓存穿透、雪崩、击穿解决方案

    一、缓存穿透 1、什么是缓存穿透 ​ 正常情况下,使用缓存的话,大部分数据都会命中缓存(缓存不存在或者过期的话,也只有一次会查询数据库),可以极大的减轻数据库的压力。 ​...如果发生一些攻击行为,攻击方伪造了一些数据(缓存不存在,数据库也不存在),那么每次查询都会去查数据库,对数据库造成压力。...那么我们就可以为这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null 。 这样就只会查一次数据库,但是别忘了设置过期时间。 ​...我们可以提前将数据初始化到布隆过滤器里,请求过来时,如果布隆过滤器判断不存在那么就直接返回,如果存在那就查缓存->查数据库。...缓存在某个时间点过期了,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求就会打到数据库上,这个时候请求量很大的话可能会瞬间把后端DB压垮。

    1.4K10

    Mysql获取数据的总行数count(*)很慢

    引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候直接返回个数,效率很高 而innoDB引擎就麻烦了,他的执行count(*)的时候,是一行行的累加计数 当然我们要知道此事的说的是没有带条件的...count(*),如果加了where条件的话,MyiSAM返回也不能返回的很快 由于我们现在如果使用mysql,大多使用的存储引擎都是innodb,因此由于他是一行行的累计计数,因此随着数据的越来越多...,返回的速度就越慢的原因 为什么innodb不跟MyiSAM一样,也把数据存起来呢 那是因为即使在同一时刻的多个查询,由于多版本控制(MVCC)的原因,innoDB应该返回多少行也是不确定的,这里,我们用...,redis就加1,每次删除就减一,试想一下还有什么问题吗 缓存系统可能会发生数据丢失,由于redis不能永久的存储在内存中,因此我们可能会想到持久化存储起来,即使这样,万一redis异常重启了,有可能会发生数据丢失...当然我们上面我们说过由于事物的支持,会导致不同回话会导致查询数据不一致性,但是我们也可以根据事物的特性,把不准确的问题解决掉, ?

    5K20

    高并发中幂等的实现

    在高并发、分布式系统中,对幂等的控制非常重要。 严格幂等:同一笔交易,无论请求方发送多少次请求,服务方只处理一次,且后续的返回信息都和第一次返回的信息相同。...这样也可以保证只处理一次,但不保证每次返回的结果相同。 幂等的实现 数据库实现 在IT系统中,最常见的幂等实现方式,是利用交易流水在数据库表里面设置的唯一约束来实现,这种方法实现成本低,效果好。...//1 先查询流水号123的数据存不存在 Select * from business where order_no = ‘123’; //2 不存在,插入数据 Insert into business...因为在分布式系统中,同样的应用会部署若干台机器,synchronized同步块只能同步同一个jvm中的不同线程。对于不同的jvm中的线程,完全没有控制力。...即使在分布式情况下也能保证。 正确改进: 可以想到第一步select查询操作是多余的,因为数据库的唯一性约束会帮我们保证只有一个线程插入成功,所以可以去掉第一条语句。

    1.1K40

    初识Sys · 轻松掌握MySQL系统库配置表

    sys_config 表简介在 MySQL 5.8 中,sys 系统库中包含的 sys_config 表用于存储数据库中的配置信息。...通过修改这个表,可以轻松对系统配置进行持久化管理,也就是说,即使重启数据库,配置也不会丢失。sys_config 表提供了一个集中管理 MySQL 系统配置选项的方式,允许用户根据需要进行调整和优化。...如果存在且非空,系统会优先使用自定义变量的值;否则,将从 sys_config 表中读取默认配置。...如果希望恢复默认配置(64 个字符),可以将这个变量设为 NULL 或者重启会话:SET @sys.statement_truncate_len = NULL;注意:如果当前会话中存在自定义变量值(如上例中的...32),那么即使在 sys_config 表中修改了 statement_truncate_len,对当前会话来说,新的值也不会生效。

    24910

    MySQL为Null会导致5个问题,个个致命!

    有了数据之后,我们就来看当列中存在 NULL 值时,究竟会导致哪些问题?...2.distinct 数据丢失 当使用 count(distinct col1, col2) 查询时,如果其中一列为 NULL,那么即使另一列有不同的值,那么查询的结果也会将数据丢失,如下 SQL 所示...3.select 数据丢失 如果某列存在 NULL 值时,如果执行非等于查询(/!=)会导致为 NULL 值的结果丢失。 比如以下这个数据: ?...4.导致空指针异常 如果某列存在 NULL 值时,可能会导致 sum(column) 的返回结果为 NULL 而非 0,如果 sum 查询的结果为 NULL 就可以能会导致程序执行时空指针异常(NPE)...从上述结果可以看出,即使 name 中有 NULL 值也不会影响 MySQL 使用索引进行查询。

    1.9K20

    阿里二面:要保证消息不丢失,又不重复,消息队列怎么选型?

    因为即使消息发送到 Broker,如果在消费者拉取到消息之前,Broker 宕机了,消息还没有落盘,也会导致消息丢失。...Broker 集群 如果 Broker 集群中只有一个节点,即使消息落盘成功了,Broker 发送故障,在 Broker 恢复以前消费者也会拉取不到消息。...这样要保证消息不丢失,需要在返回 ACK 之前把消息保存到本地,比如持久化到数据库,后面可以取数据库保存的消息进行处理。...数据库唯一键约束 如果消息会落本地数据库,可以采用消息 ID 作为唯一键。如果消息不落数据库,可以将消息 ID 或者消息中其他唯一能标识消息的属性作为唯一键落业务数据表。...保存消费记录 我们也可以将消息 ID 保存 Redis,消费消息前判断消息 ID 是否已存在。

    27510

    Java开发手册之SQL语句

    【强制】不要使用count(列名)或count(常量)来替代count(),count()是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。...说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。...【强制】count(distinct col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为...3) NULL1的返回结果是NULL,而不是true。 【强制】 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。...外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。 【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

    69520

    SQL优化

    在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。 1....即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。 2....Order by语句 ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。...换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例: … where status ’INVALID'; 对这个查询,可以改写为不使用NOT: select * from...3、最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.NULL值也是可能会需要占用空间的,一些定长的数据类型即使数据为NULL也是会占用空间的。

    4.8K20

    Mysql命名规范

    ,互联网业务,能让站点层和服务层干的事情,不要交到数据库层 2)调试,排错,迁移都比较困难,扩展性、移植性较差 复制代码 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径...说明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:`where a>? and b=?` 那么即使 a 的区分度更高,也必须把 b 放在索引的最前列。...,也返回为 0。...3) `NULL1` 的返回结果是 `NULL`,而不是 `true`。 复制代码 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。...外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

    8K21

    MySQL深入学习第十四篇-count(*)这么慢,我该怎么办?

    MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; 2....因此,MySQL 优化器会找到最小的那棵树来遍历。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。...但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...在数据库保存计数 根据上面的分析,用缓存系统保存计数有丢失数据和计数不精确的问题。那么,如果我们把这个计数直接放到数据库里单独的一张计数表 C 中,又会怎么样呢?...小结 今天,我和你聊了聊 MySQL 中获得表行数的两种方法。我们提到了在不同引擎中 count(*) 的实现方式是不一样的,也分析了用缓存系统来存储计数值存在的问题。

    1.9K10

    MySQL实战第十四讲-count(*)这么慢,我该怎么办?

    MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; 2. ...因此,MySQL 优化器会找到最小的那棵树来遍历。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。...但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...在数据库保存计数 根据上面的分析,用缓存系统保存计数有丢失数据和计数不精确的问题。那么,如果我们把这个计数直接放到数据库里单独的一张计数表 C 中,又会怎么样呢?...小结 今天,我和你聊了聊 MySQL 中获得表行数的两种方法。我们提到了在不同引擎中 count(*) 的实现方式是不一样的,也分析了用缓存系统来存储计数值存在的问题。

    1.7K10

    count(*)慢,该怎么办?

    随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。...MyISAM 引擎把一个表的总行数存在了磁盘上,执行 count(*) 的时候会直接返回这个数,效率很高;InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来...因此,MySQL 优化器会找到最小的那棵树来遍历。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。...但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...在数据库保存计数根据上面的分析,用缓存系统保存计数有丢失数据和计数不精确的问题。那么,如果我们把这个计数直接放到数据库里单独的一张计数表 C 中,又会怎么样呢?

    29900
    领券