自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(266)
  • 资源 (3)
  • 收藏
  • 关注

原创 闲谈redis的bitmap

bitmap的原理bitmap就是通过最小的单位bit(8bit = 1b = 0.001kb)来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。优点基于最小的单位bit进行存储,所以非常省空间。 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。 二进制数据的存储,进行相关计算的时候非常快。 方便扩容缺点redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个ke

2020-10-09 16:37:21 553

原创 闲聊进程和线程

CPUcpu是计算机的中央运算单元,从内存里面读取一条一条的代码指令,然后根据指令来执行运算(加,减,乘,除,复制数据等)。CPU在运算的过程中一些数据存放在CPU的寄存器和内存里面。CPU里面有各种寄存器,指令指针寄存器存放当前执行到那条代码指令(写完程序后被编译器编译成二进制指令代码)。内核与虚拟内存启动代码后运行OS内核,内核里也有线程,这个我们把它叫做内核态。内核启动以后,内核将物理内存管理起来,内核提供虚拟内存管理机制给每个进程内存服务。每个进程都有自己的虚拟内存空间,这里

2020-09-23 11:07:09 275

原创 闲谈常见SQL语句加锁

锁是使用数据库时避不开的问题,MySQL 中的锁可以分成两个粒度:表锁和行锁。表锁:表级读锁,表级写锁,读意向锁,写意向锁,自增锁行锁:读记录锁,写记录锁,间隙锁,Next-key 锁,插入意向锁。这些锁一旦冲突就会导致死锁问题的产生。S锁和X锁S锁:共享锁,加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁 X锁:排他锁,加了X锁的记录,不允许其他事务再加S锁或者X锁意向锁意向锁的存在是为了协调行锁和表锁的关系,表明某个事务持有了锁、或准备去持有锁,支持多粒度(表锁与

2020-09-17 16:44:50 682

原创 闲谈mysql的redo log和undo log

redo log想要保证一致性最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题。Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了。一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差。redo log只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。redo log.

2020-09-08 17:56:21 267

原创 闲谈MyBatis一级缓存和二级缓存区别

缓存将数据存放在程序内存中,用于减轻数据查询的压力,提升读取数据的速度,提高性能。一级缓存Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。一级缓存只是相对于同一个SqlSession而言,生命周期和SqlSession一致。生命周期MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSes

2020-09-02 14:17:04 1112

原创 闲谈redis部署的几种方式

单机模式优点架构简单,部署方便 高性价比高,缓存使用时无需备用节点(单实例可用性可以用supervisor或crontab保证),当然为了满足业务的高可用性,也可以牺牲一个备用节点,但同时刻只有一个实例对外提供服务。缺点不保证数据的可靠性。即使有备用的节点解决高可用性,但是仍然不能解决缓存预热问题,因此不适用于数据可靠性要求高的业务。 高性能受限于单核CPU的处理能力(Redis是单线程机制),CPU为主要瓶颈,所以适合操作命令简单,排序、计算较少的场景。主从模式Redis多副本,采

2020-09-01 11:05:12 350

原创 mysql使用经验汇总

添加索引数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度。 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为.

2020-08-27 15:51:50 154

原创 高频热点账户问题解决

金融账户系统的特点是并发量大、响应快、交易金额大,热点账户问题突出。一个合格的账户系统既要解决上述问题,又必须绝对保证资金安全。记账分录充值借方:三方支付待清算账户(+)贷方:个人余额账户(+)三方支付的待清算账户是热点账户,频繁的增加余额。提现借方:个人余额账户(-)贷方:三方支付资产账户(-)三方支付的资产账户是热点账户,频繁的减少余额。服务费收款借方:个人账户(-)贷方:商户服务费账户(+)商户服务费账户就是热点账户,会频繁增加余额。服务费付款

2020-08-27 10:13:44 413

原创 浅谈MySql解决幻读

事务的隔离级别读未提交事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。读已提交大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。可重复读保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。串行化最严格的级别,事务

2020-08-25 19:35:13 168

原创 浅谈业务流程中的mq使用方式

假设有个场景:下单成功需要给用户发送消息通知,发送消息通知通过mq实现事务提交前发送mq消息step1:start transactionstep2:生成订单step3:投递消息到mqstep4:commit transaction问题:step3发生异常会导致step4失败,下单失败,直接影响到下单业务step4发生异常,其他step成功。事务回滚下单失败,但是却发送了成功消息。事务之后发送消息step1:start transactionstep2:生成订单st

2020-08-25 12:04:09 377

原创 闲谈@Transactional注解失效

@Transactional 注解能保证方法内多个数据库操作原子性(要么同时成功、要么同时失败),使用@Transactional注解时需要注意使用方法,不然@Transactional会失效。@Transactional作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。 作用于接口:不推荐这种使用方法

2020-08-24 16:47:11 118

原创 分库分表的事务处理机制

将单表的数据切片后存储在多个数据库甚至多个数据库实例中,所以依靠数据库本身的事务机制不能满足所有场景的需要。在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。在分布式网络环境下,我们无法保障所有服务、数据库都百分百可用,一定会出现部分服务、数据库执行成功,另一部分执行失败的问题。两阶段提交两阶段提交协议将分布式事务分为两个阶段,一个是准备阶段,一个是提交阶段,两个阶段都由事务管理器发起。基于两阶段提交协议,事务管理器能够最大限度地保证跨数据库操作的事务的原子性,是分布

2020-08-24 16:06:37 509

原创 闲谈java线程池三两事

Executors线程池三种阻塞队列ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界 LinkedBlockingQueue<>();//基于链表的先进先出队列,无界 SynchronousQueue<>();//无缓冲的等待队列,无界四种拒绝策略ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务抛出异常 ThreadPoolExecutor.DiscardPolicy();/..

2020-08-21 17:31:38 187

原创 浅谈ForkJoin

ForkJoinForkJoin是由JDK1.7后提供多线并发处理框架,ForkJoin的框架的基本思想是分而治之。使用ForkJoin将相同的计算任务通过多线程的进行执行。从而能提高数据的计算速度。在google的中的大数据处理框架mapreduce就通过类似ForkJoin的思想。通过多线程提高大数据的处理。分而治之分而治之就是将一个复杂的计算,按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。相应的ForkJoin将复杂的计算当做一个任务。而分解的多个计算则是当做一个子任务。

2020-08-19 17:37:14 243

原创 Redisson解决redis分布式锁过期业务没执行完问题

RedissonRedisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。Redisson不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publis

2020-08-18 16:52:19 3395 5

原创 闲谈Java中的Future和FutureTask

FutureJav为了充分利用计算机CPU资源,一般开启多个线程来执行异步任务。但不管是继承Thread类还是实现Runnable接口,都无法获取任务执行的结果。JDK 5中引入了Callable和Future,通过它们执行异步任务可以获取执行结果。Future接口是长时间运行方法异步处理的理想选择,能够在等待Future封装的任务完成时执行一些其他事情。利用Future的异步性质的操作示例如下:计算密集型过程(数学和科学计算) 操纵大数据结构(大数据) 远程方法调用(下载文件,抓取HT

2020-08-17 20:01:21 249

原创 g1和cms对比

Stop the world不管选择哪种GC算法,stop-the-world都是不可避免的。Stop-the-world意味着从应用中停下来并进入到GC执行过程中去。一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。GC调优通常就是为了改善stop-the-world的时间。GC roots在Java语言中,可作为GC Roots的对象包括4种情况:虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区中类静态属性

2020-08-13 14:06:28 494

原创 G1垃圾回收参数优化

G1GCG1 GC是启发式算法,会动态调整年轻代的空间大小。目标也就是为了达到接近预期的暂停时间。G1提供了两种GC模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。Young GCYoung GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。在这种情况下,Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到老年代空间。Survivor区的数据移动到新的Survivor区中,也有部

2020-08-12 11:23:37 1568

原创 java垃圾回收对比

串行、并行与并发串行:单个线程执行垃圾回收,并且此时用户线程仍然处于等待状态。 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。 并发:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。新生代回收器名称 串行/并行/并发 回收算法 适用场景 可以与cms配合 SerialGC 串行 复制 单cpu 是 ParNewGC 并行 复制.

2020-08-11 17:32:12 260

原创 实现springboot的starter

什么是 Spring BootSpring Boot 基本上是 Spring 框架的扩展,它消除了设置 Spring 应用程序所需的复杂例行配置。我们在使用 Spring 框架的时候,我们接触得比较多的应该是 Spring MVC、 IOC 、 DI 、AOP 等等,而这些框架在使用的过程中会需要配置大量的 XML,或者需要做很多繁琐的配置。Spring Boot 可以帮助我们快速搭建一个基于 Spirng 框架以及 Spring 生态体系的应用解决方案。创建独立的 Spring 应用程序 直接嵌

2020-08-10 16:41:29 216

原创 JAVA多线程和内存模型常见问题

Java线程具有五种基本状态新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行; 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是

2020-08-07 21:49:33 81

原创 ApplicationContextAware的理解

当一个类实现了ApplicationContextAware之后,这个类就可以方便获得ApplicationContext中的所有bean,这个类可以直接获取spring配置文件中,所有有引用到的bean对象。@Componentpublic final class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext;

2020-08-06 19:42:46 486 1

原创 闲谈Mysql中的Buffer pool

应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存里,避免每次都去访问数据库。操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。预读磁盘读写,并不是按需读取,而是按页读取,一次至少读一页数据(一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。数据访问,通常都遵循“集中读写”的原则,使用一些数据,大概率

2020-08-06 15:38:05 147

原创 Springboot内置Tomcat线程数优化

# 等待队列长度,默认100。队列也做缓冲池用,但也不能无限长,不但消耗内存,而且出队入队也消耗CPUserver.tomcat.accept-count=1000 # 最大工作线程数,默认200。(4核8g内存,线程数800,一般是核数*200。操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)server.tomcat.max-threads=800# 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)server.tomcat.min-spare-thr.

2020-08-03 17:24:43 5663

原创 浅谈cpu.idle和cpu.load

最近在配合运维进行系统压测,进行系统评估的时候cpu.idle和cpu.load是两个主要参考指标。在Linux系统中,通过top命令可以查看cpu.idle和cpu.load。在说明这两个指标之前,必须对系统运转有一个整体的认识。在Linux内核中,每个进程都会被分配一个固定的时间片(默认为10ms)。在这10ms中,该进程享有cpu的所有权。如果该进程用完了10ms,或者有其他优先级高的进程发出请求,系统会触发一个中断,内核重新接管cpu,内核分配cpu给其他进程。10ms的分片让用户,

2020-07-29 16:17:44 1311

原创 Zookeeper的一致性协议-Zab协议

什么是Zab协议?Zab协议 的全称是Zookeeper Atomic Broadcast(Zookeeper原子广播),Zookeeper 是通过 Zab 协议来保证分布式事务的最终一致性。Zab协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,是Zookeeper保证数据一致性的核心算法。Zab借鉴了Paxos算法,但又不像Paxos那样,是一种通用的分布式一致性算法。它是特别为Zookeeper设计的支持崩溃恢复的原子广播协议。在Zookeeper中主要依...

2020-07-28 20:17:02 152

原创 jstat和jmap

之前的文章讲了jstack的用法,这篇文章讲下其他两种方便排查问题的命令jstat、jmap。jstatjstat对于查看Jvm的堆栈信息很有用。能够查看eden,survivor,old,perm等heap的capacity,utility信息,对于查看系统是不是有能存泄漏以及参数设置是否合理有不错的意义。jstat -gc pid可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间.

2020-07-27 14:11:03 2681

原创 mq选型:rocketMq和kafka对比

为什么在RocketMQ和kafka中选型在单机同步发送的场景下,Kafka>RocketMQ,Kafka的吞吐量高达17.3w/s,RocketMQ吞吐量在11.6w/s。kafka高性能原因生产者Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术,顺序写入和MMFile。顺序写入因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最“讨厌”随机I/O,最喜欢顺序I/O。为了提

2020-07-23 19:02:23 1621 1

原创 netty高性能的原因

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。高性能的原因采用异步非阻塞的I/O类库,基于Reactor 模式实现,Nett

2020-07-22 18:59:11 176

原创 jstack问题定位分析

jstackjstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。jstack主要用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,

2020-07-22 16:30:46 561

原创 闲谈Dubbo性能调优

参数配置优先级dubbo中的配置存在优先级,不考虑优先级的话,很有可能出现调优参数设置了却没生效的问题。dubbo分为consumer和provider端,在配置各个参数时,其优先级如下:consumer的method配置 provider的method配置 consumer的reference配置 provider的service配置 consumer的consumer节点配置 provider的provider节点配置方法级的配置优先级高于接口级,consumer的优先级高于p.

2020-07-21 21:42:31 494

原创 本地缓存组件Caffeine

本地缓存缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。Redis 作为缓存组件,能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销。本地缓存是直接从本地内存中读取,没有网络开销。例如秒杀系统或者数据量小的缓存等,比远程缓存更合适。CaffeineCaffeine 是基于 JAVA 8 的高性能缓存库,在 spring5 (springboot 2.x) 后,spring 官方

2020-07-20 17:23:48 291

原创 redis热点问题

热点Key如何产生?双十一期间某些热门商品的降价促销,当这其中的某一件商品被数万次点击浏览或者购买时,会形成一个较大的需求量,这种情况下就会造成热点问题。热点新闻、热点评论等典型的读多写少的场景也会出现同样的问题。 请求分片集中,超过单 Server 的性能极限。在服务端读数据进行访问时,往往会对数据进行分片切分,此过程中会在某一主机 Server 上对相应的 Key 进行访问,当访问超过 Server 极限时,就会导致热点 Key 问题的产生。热点Key的危害当某一热点 Key 的请求在某一主

2020-07-20 11:21:59 178

原创 redis常见问题和解决方案汇总

缓存穿透访问不存在的key,导致每次都去DB查找,从而失去了缓存的意义,也加大了DB的压力。失去了缓存的意义,访问这些key频次高的话,会加大DB压力,甚至导致DB崩溃。解决方案使用布隆过滤器,将所有存在的key哈希到一个足够大的bitmap中。一个不存在的key一定能被挡住,但如果结果告诉程序某个key存在,并不一定存在(因为存在hash碰撞)。 回填空值到缓存,需要注意缓存过期时间缓存击穿由于设置了过期时间,如果在同一时间内一个key(热key)失效,如果某些时间内被高频词访问,那么

2020-07-18 13:52:07 212

原创 MySQL事务隔离级别的实现原理

隔离级别读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题 读已提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题 可重复读:同一个事务中多次读取相同的数据返回的结果是一样的。其避免了脏读和不可重复读问题,但是幻读依然存在 串行化:事务串行之行。避免了以上所有问题。MVCCMVCC的全称多版本并发控制,MVCC使得InnoDB的事务隔离级别下执行一致性读操作有了保证。简单说就是为了查询一些正在被另一个事务更新的行,

2020-07-17 20:52:23 118

原创 浅谈AQS(AbstractQueuedSynchronizer)

AQSAQS(AbstractQueuedSynchronizer)即队列同步器,提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等并发类均是基于AQS来实现的,具体用法是通过继承AQS实现其模板方法,然后将子类作为同步组件的内部类。AQS维护了一个volatile语义(支持多线程下的可见性)的共享资源变量state和一个FIFO线程等待队列(多线程竞争state被阻塞时会进入此队

2020-07-17 17:28:49 109

原创 强引用、软引用、弱引用、虚引用的区别

Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用强引用(StrongReference)强引用是使用最普遍的引用。我们使用的大部分引用实际上都是强引用。Object object = new Object();String str = "StrongReference";如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryErro...

2020-07-17 16:22:08 126

原创 怎么保证RocketMQ消息不丢失?

RocketMQ消息大致流程过程如下producer(生产者生产消息)->broker(存储消息)->cunmser(消费消息)producer默认情况下,可以通过同步的方式阻塞式的发送,check SendStatus,状态是OK,表示消息一定成功的投递到了Broker。状态超时或者失败,则会触发默认的2次重试。此方法的发送结果,可能Broker存储成功了,也可能没成功。 采取事务消息的投递方式,并不能保证消息100%投递成功到了Broker,但是如果消息发送Ack失败的话,此消息

2020-07-17 13:58:54 369

原创 HashMap JDK7产生死锁的原因

HashMap是非线程安全,死锁一般都是产生于并发情况下。JDK7中的HashMapHashMap底层维护一个数组,数组中的每一项都是一个Entrytransient Entry<K,V>[] table;向 HashMap 中所放置的对象实际上是存储在该数组当中; 而Map中的key,value则以Entry的形式存放在数组中。这个Entry应该放在数组的哪一个位置上(这个位置通常称为位桶或者hash桶,即hash值相同的Entry会放在同一位置,用链表相连),是通过key

2020-07-16 20:02:36 855

原创 mysql联合索引最左匹配原则的原因

联合索引是什么?对多个字段同时建立的索引。联合索引是有顺序的,ABC,ACB是完全不同的两种联合索引。以联合索引(a,b,c)为例,建立这样的索引相当于建立了索引a、ab、abc三个索引。一个索引顶三个索引当然是好事,但是每多一个索引都会增加写操作的开销和磁盘空间的开销,需要谨慎使用。最左匹配原则(A,B,C) 这样3列,mysql会首先匹配A,然后再B,C。如果用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。如果使用(A,C)这样的数据来检索的话,就会先找到所有A的值然后匹

2020-07-16 16:51:09 1041

.net网站监听程序

.net监听程序,网站报错时将错误信息及时发到负责人邮箱。

2013-02-21

程序员职业规划哲理思想

程序员职业规划哲理思想,为你铺就成功之路

2012-04-04

2011年计算机考研专业课真题

2011年计算机考研专业课真题,希望对你有帮助

2012-02-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除