过程中大家也积极讨论了一些防破解的方法,在征得到大家的同意后,我将讨论的方案整理了出来,希望对正在做小游戏的开发者们有所帮助或启发,如果你有更好的方案也欢迎留言讨论。...除了使用 javascript-obfuscator 提供的命令行工具,它还支持 Grunt、Gulp、Webpack 等插件方式,具体使用方法请参考官方教程,这里就不赘述了。...1 弱联网 将我们的游戏关键数据保存到服务器上,比如关键配置、用户存档,或者是向服务请求加密验证,在游戏中使用自己的平台 appid 作为密钥等手段。...在工程中保存一个空配置文件,开发模式时不用读取它。发布 Release 构建时,对生成的关键图片资源、JS代码等生成 MD5 指纹,替换到构建资源中。...游戏被盗,作为个人是很难与一些不良公司抗衡的,更重要的是它会极大地打击我们学习和创作的动力。上面介绍了三种保护游戏的方案,抛砖引玉,相信大家还有更多更好的方法,欢迎大家留言讨论或来公众号分享你的经验。
在逛 Stack Overflow 的时候,发现了一些访问量像熊耳山一样高的问题,比如说这个:为什么不应该使用Java的原始类型?访问量足足有 205K+,这不得了啊!...说明有很多很多的程序员被这个问题困扰过。实话实说吧,本文之前的我就是其中之一。 来回顾一下提问者的问题吧: Java 的原始类型是什么?为什么不要使用原始类型?...如果不能使用原始类型,有什么更好的选择呢? 如果大家也被这个问题困扰过,或者正在被困扰,就请随我来,咱们肩并肩手拉手一起梳理一下这个问题,并找出最佳答案。...extends Number> 02、为什么不要使用原始类型? 大家可能会有一个疑惑,原始类型用起来很爽啊!因为不用关心放入 List 的元素到底是什么类型,想放什么就可以放什么,不要太爽啊!...但我要想表达的是登月男神阿姆斯特朗的那句话:“这是我个人的一小步,却是人类的一大步。”能向前迈一步是一步啊。 那最优的选择是什么呢?
我想大家可能有一种误区,我说的是底层数据结构,而你说仅仅是数据的保存形式而已。 那么Redis底层有哪几种数据结构呢?和几种数据保存形式的关系又是什么呢?...既然数据本身是通过数据结构保存的,那么键和值是什么保存形式呢? 键和值的保存形式? 为了实现键和值的快速访问,Redis使用的是哈希表来存放键,使用哈希桶存放值。...这也解释了为什么哈希桶能够保存集合类型的数据了,也就是说不管是String还是集合类型,哈希桶保存的都是指向具体的值的指针,具体的结构如下图: 图片 从上图可以看出,每个entry中保存的是*key和*...范围操作非常耗时,应该避免 范围操作是指集合类型中的遍历操作,可以返回集合中的所有数据或者部分数据。...比如List类型的HGETALL 和Set 类型的SMEMBERS,这类操作的复杂度为O(N),比较耗时,应该避免。
作为一个开发人员,我不喜欢用我不明白的东西。而且,数据库已经使用了40年之久,一定有理由的。多年以来,我花了成百上千个小时来真正领会这些我每天都在用的、古怪的黑盒子。...时间复杂度不会给出确切的运算次数,但是给出的是一种理念。 ? 图中可以看到不同类型的复杂度的演变过程,我用了对数尺来建这个图。具体点儿说,数据量以很快的速度从1条增长到10亿条。...这个二维阵列是带有行与列的表: 每个行代表一个主体 列用来描述主体的特征 每个列保存某一种类型对数据(整数、字符串、日期……) 虽然用这个方法保存和视觉化数据很棒,但是当你要查找特定的值它就很糟糕了。...所以有些人听到过使用太多索引不是个好主意这类说法。没错,你减慢了快速插入/更新/删除表中的一个行的操作,因为数据库需要以代价高昂的每索引 O(log(N)) 运算来更新表的索引。...这个数据结构也被数据库用来保存一些内部的东西(比如锁表或者缓冲池,我们在下文会研究这两个概念)。 哈希表这种数据结构可以用关键字来快速找到一个元素。
如果使用非索引字段进行分组,MySQL只能进行全表扫描后建立临时表才能得出分组结果。 另外我们可以使用explain关键字来分析SQL语句的效率,查看SQL语句是否覆盖索引。...经常在where子句中出现的字段应该建立索引。 尽量使用数据量小的字段建立索引。例如对于char(500)和char(10)两个字段类型来说,肯定是以后者进行索引匹配的速度更快。...如果是二级索引建立的B-Tree,每个叶子节点的值保存的是对应行数据的主键。那一级索引叶子节点保存什么呢?一级索引也就是主键索引,下文我会告诉大家。...但其实哈希索引也有它的闪光灯,哈希索引会为所有的索引列计算一个哈希码。同时在哈希表中保存哈希码和指向每个数据行的指针,这种结构对精确匹配查询的效率极高。...聚簇索引通过主键来建树,它的叶子节点包含了行的全部数据。 这就把两者相关联起来了,通过二级索引查找行,需要先在二级索引建立的B-Tree上找到主键的值,接着再从聚簇索引建立的B-Tree找到行数据。
可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。 下面我主要从使用的角度,为你简单分析一下这三种模型的区别。...还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示: ? 这里我们假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。...也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的。...当然事无绝对,我们来分析一下哪些场景下应该使用自增主键,而哪些场景下不应该。...除了考虑性能外,我们还可以从存储空间的角度来看,假设你的表中确实有一个唯一字段,比如字符串类型的身份证号,那应该用身份证号做主键,还是用自增字段做主键呢?
可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。 下面我主要从使用的角度,为你简单分析一下这三种模型的区别。...还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意如下图2所示: 这里我们假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。...也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的。...当然事无绝对,我们来分析一下哪些场景下应该使用自增主键,而哪些场景下不应该。...除了考虑性能外,我们还可以从存储空间的角度来看,假设你的表中确实有一个唯一字段,比如字符串类型的身份证号,那应该用身份证号做主键,还是用自增字段做主键呢?
SHOW ENGINES; 三、存储引擎原理 首先针对可能面试会问到的问题「MyISAM 和 InnoDB 两种引擎所使用的索引的数据结构是什么」做一个回答: 都是 B+ 树,不过区别在于: MyISAM...中 B+ 树的数据结构存储的内容是实际数据的地址值,它的索引和实际数据是分开的,只不过使用索引指向了实际数据。...因此,主键不应该过大,因为主键太大,其他索引也都会很大。MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。...潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。...InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有 在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。
使用比较巧妙的数据结构,利用数据结构的特性来大大减少查找遍历次数 优点: 使用索引可以大大减少检索的数据量,从而加快数据的检索速度, 这也是创建索引的最主要的原因。...从宏观定义上来讲: 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引。聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。术语“聚簇”表示数据行和相邻的键值紧凑的存储在一起。...叶子节点的data域存储的是主键值或行记录的内存地址的叫非聚集索引,存储引擎为MYISAM的表的索引类型为非聚集索引,它的索引和数据是分开存储的。 存储引擎是修饰什么?...这不是绝对的,和行记录的大小有关。 索引和数据存放位置? 和表的存储引擎类型有关。 InnoDB存储引擎:索引和数据存放在xxx.ibd文件。...,同时却降低更新表的速度,因为更新表时,MySQL不仅需要保存数据,还要保存一下索引文件,所以会带来很大的性能开销。
2.2 概念 数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。2.2.1什么是数据库数据库就是存储数据的仓库。...行:行(row)表中的一个(行)记录表中的数据是按行存储的,所保存的每个记录存储在自己的行内,如果将表想象成网格,网格中垂直的列为表列,水平行为表行主键:主键(primary key)一列或一组列,其值能够唯一区分表中的每一行...表中每一行都应该可以唯一标识自己的一列。一个顾客表可以使用顾客编号,而订单表可以使用订单ID。一个表中没有主键的话,更新或删除特定行的话很困难,因为没有相关的方法保证只涉及相关的行。...主键的规则 表中的任何列都可以作为主键,只要它满足以下条件:任何两行都不具有相同的主键值(每一行的主键值唯一)每个行都必须具有主键值(主键值不允许null)主键的好习惯除了强制的规则外,应该坚持的几个普遍认可的好习惯...,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。
MySQL默认使用主键建立索引树,如果没有主键会看是否有可以唯一标识一个行记录的列,有则使用该列建立索引树,没有的话MySQL内部会创建一个隐含的列类似于rowid来建立索引树。...密集索引:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引。...那什么时候采用全表扫描的方式,什么时候使用采用辅助索引 + 回表的方式去执行查询呢?...这个就是查询优化器做的工作,查询优化器会事先对表中的记录计算一些统计数据,然后再利用这些统计数据根据查询的条件来计算一下需要回表的记录数,需要回表的记录数越多,就越倾向于使用全表扫描,反之倾向于使用辅助索引...(尤其对于BLOB、TEXT或者很长的VARCHAR类型的列,应该使用前缀索引,因为MySQL不允许索引这些列的完整长度)。
大家好,又见面了,我是全栈君。 一、索引 1、什么是索引 索引是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引。...具体的参考: http://www.2cto.com/database/201501/368126.html 作为索引中最为常见的一种类型,B-Tree索引大都采用的是 B+Tree数据结构来存储数据...二、MyISAM索引的实现 MyISAM索引文件和数据文件是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。...通过该值,存储引擎能顺利地进行回表查询,得到一行完整记录。同时,每个叶子页也保存了指向下一个叶子页的指针。从而方便叶子节点的范围遍历。...四、总结 1、关于innoDB中索引的使用 了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键
补充知识: 索引相关原理和知识 一、索引原理 二、磁盘IO与预读 三、索引的数据结构 四、B+树的查找过程 五、B+树性质 索引使用注意事项与数据类型选择 一、索引使用注意事项 二、选择索引的数据类型...在读多写少的应用中,读写不冲突非常重要,极大的增加了系统的并发性。InnoDB使用的是行锁,并且采用了多版本并发控制来提高读操作的性能。 什么是多版本并发控制呢?...三、索引的数据结构 任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,...在MySQL中,应用内置的日期和时间数据类型,而不是字符串来存储时间;以及用整形数据存储IP地址。 尽量避免NULL:应该制定列为NOT NULL,除非你想存储NULL。...尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。 使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
持久性(Durability) 已被提交的事务对数据库的修改应该永久保存在数据库中。 一般来说,事务的 ACID 由 RDBMS 来实现的,RDBMS 采用日志来保证事务的原子性,一致性,持久性。...使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。可以把数据库索引比作书的目录索引,当我们需要在一本动物百科里寻找秋田犬的时候,可以通过目录快速定位到具体的位置。...所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。 数据库管理系统(RDBMS)通常决定索引应该用哪些数据结构。...哈希表是无顺的数据结构,对于很多类型的查询语句(范围查询)哈希索引都无能为力。哈希表的键值映射也暗示其键的存储是无序的。...主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 4、什么是视图? 视图是一种虚拟的表,具有和物理表相同的功能。...6、 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? 尽可能使用约束,如 check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。...第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索引。...(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。...TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。 索引的分类 聚集索引:对正文内容按照一定规则排列的目录称为聚集索引。 ...索引采取什么数据结构存储?为什么采取这样的数据结构? ...数据库管理系统(RDBMS)通常决定索引应该用哪些数据结构。但是,在某些情况下,你在创建索引时可以指定索引要使用的数据结构。 为什么使用B+树? ...哈希索引的缺点 哈希表是无顺序的数据结构,对于很多类型的查询语句哈希索引都无能为力。举例来说,假如你想要找出所有小于40岁的员工。你怎么使用使用哈希索引进行查询?...这就是为什么哈希索引通常不是数据库索引的默认数据结构-因为在作为索引的数据结构时,其不像B-Tree那么灵活。 还有什么其他类型的索引?
文本公众号来源: 我没有三颗心脏 作者: 我没有三颗心脏 1)什么是存储过程?有哪些优缺点?...在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。 底层数据结构是什么,为什么使用这种数据结构?...(此时,你应该在白纸上画出什么是B+树) 索引的分类? 唯一索引:唯一索引不允许两行具有相同的索引值 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。...持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存 实例说明: /* * 我们来模拟A向B账号转账的场景 * A和B账户都有1000块,现在我让A账户向B账号转500...通过explain命令可以得到表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用以及每张表有多少行被优化器查询等问题。
可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。 下面我主要从使用的角度,为你简单分析一下这三种模型的区别。...还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示: 这里我们假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。...也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10ms的时间,这个查询可真够慢的。 为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。...当然事无绝对,我们来分析一下哪些场景下应该使用自增主键,而哪些场景下不应该。...除了考虑性能外,我们还可以从存储空间的角度来看。假设你的表中确实有一个唯一字段,比如字符串类型的身份证号,那应该用身份证号做主键,还是用自增字段做主键呢? 由于每个非主键索引的叶子节点上都是主键的值。
底层数据结构是什么,为什么使用这种数据结构?...(此时,你应该在白纸上画出什么是B+树) 索引的分类? 唯一索引:唯一索引不允许两行具有相同的索引值 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。...持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存 实例说明: /* * 我们来模拟A向B账号转账的场景 * A和B账户都有1000块,现在我让A账户向B账号转500...表主键:MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址。...通过explain命令可以得到表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用以及每张表有多少行被优化器查询等问题。
领取专属 10元无门槛券
手把手带您无忧上云