精华内容
下载资源
问答
  • 所以,结合相关书籍资料,以及维基百科,我个人理解如下,希望帮助吧: [相关术语]: 1.list:列表,又称序列,表示一组可数的有序的数值。 本身可以对应多种数据结构,其中最具代表性的就是数组(array)和链表...

    我觉得需要先梳理相关的概念,国内部分的教材,概念可能因为计算机理论的快速发展和更新而变得比较模糊和陈旧(有些教材因为编纂比较早,可能现在来看有些内容就不太合适了)
    所以,结合相关书籍资料,以及维基百科,我个人理解如下,希望有帮助吧:
    [相关术语]:

    1.list:

    列表,又称序列,表示一组可数的有序的数值。
    本身可以对应多种数据结构,其中最具代表性的就是数组(array)和链表(linked list)
    

    2.hash table / hash map :

    哈希表,又称为散列表,是一种比搜索树(search trees)或者任何其他的表查找结构(table lookup structure)更有效数据结构,一般应用于关联数组、数据库索引、高速缓存和集合等方面
    

    3.hash list / hash sequence:

    哈希序列,又称为散列序列,是一个数组或链表,其元素或结点是哈希值(hash value)的数据结构,一般应用于快速查表(哈希表),分布式数据库(分布式哈希表)以及保证数据完整性等方面
    
    // 在 wiki 上特别指出了: hash list 和 hash table 不是一个东西, “(hash table) Not to be confused with Hash list or Hash tree.”
    
    // 参考: https://stackoverflow.com/questions/2974597/hash-table-vs-hash-list-vs-hash-tree
    
    // 个人理解是 hash table 的概念更广义一些,泛指一切 key 为 hashcode 的键值对形式的数据结构:<hashcode,value>,当文献强调 hash table 时,可能会比较注重 hashcode 如何计算,均匀性的内容
    
    // 而 hash list、hash tree 的概念和具体的应用联系紧密,可以认为是 hash table 概念的数组/链表结构、树结构的具体实现,当文献强调 hash list、hash tree 时,可能会比较注重冲突处理、动态调整的内容
    
    // 那么,下面的概念性的描述一般都是针对 hash table 的,但是具体的一些问题,以及对应问题的处理是需要结合其具体的数据结构来看的
    
    // 比如: 用数组实现 hash table 和用树实现 hash table ,遇到的问题,以及处理方法肯定不同   

    4.hash function:

    哈希表是一种通过 keys 对 value 的映射,来实现数据访问的数据结构,而这种映射一般分为两个阶段:
    1)将关键字 key 作为自变量, 通过一定的函数关系,计算出的因变量作为 value 的索引(index)
    2)如果该索引指向的空间上没有存储数据,则将 value 插入,否则,称为产生了一个冲突(collision),需要对冲突进行处理,之后找到新的没有数据的空间,再将 value 插入
    

    // 这种函数关系是通过哈希函数(hash function)来实现的, 即将任意长度的数据映射为较短的固定长度的数据,该数据(也就是
    index)也被称为哈希值(hash values / hash codes)

    // 通过索引,可以在数组中找到一个元素,通过该元素可以找到 key 所对应的 value, value
    也被称为记录(entry),该数组被称为桶数组(buckets array)或者关联数组(associative array)

    // 桶数组的元素被称为桶(bucket)或者槽(slot)

    5.collision resolution:

    冲突处理,当key的集合很大的时候,根据生日问题(birthday problem)原理,哈希冲突实际上是不可避免的,所以几乎所有的哈希表都会有对于冲突的解决策略,常见的方法有三种;
    1)拉链法(separate chaining):也被称为开放散列法(open hashing)或封闭定址法(closed addressing)
    
    2)开放定址法(open addressing),也被称为封闭散列(closed hashing)
    3)建立公共溢出区(building a public overflow area)
    
    4)其他方法:
        ①联合哈希法(coalesced hashing)
        ②疯狂哈希法(cuckoo hashing)
        ③跳房子哈希法(hopscotch hashing)
        ④罗宾汉哈希法(robin hood hashing)
        ⑤二选哈希法(2-choice hashing)
    

    6.open hashing:

    开放散列,也称开放哈希,所有的纪录都不存储在桶数组中,每个桶都是独立的,每个桶都会对应一组有序的记录,存储这些记录的结构有3种
    1)链表结构(separate chaining with linked lists),存储记录的是链表,即每个桶存一个指针,指向一个链表,链表中的结点(node)就是记录,该链表也被称为桶链(bucket chains)
    2)列表头元素结构(separate chaining with list head cells),每个桶存的是该桶中的第一个记录,每个记录通过 next 指针和后面的记录相连,和 linked list 相比少了一个头指针
    3)其他结构(separate chaining with other structures),将桶链替换为其他的数据结构,比如自平衡树(self-balancing tree),比如动态数组(动态数组每次增长固定的大小)
    

    7.closed hashing

    1)封闭散列,也称封闭哈希,所有的记录都存储在桶数组中,当一个新的纪录插入桶数组时,必须对数组进行探测(probe)
    2)探测是通过探测序列(probe sequence)实现的,用于找到一个没有存储数据的槽,常用的探测序列有:
        ①线性探测(linear probing)
        ②二次探测(quadratic probing)
        ③伪随机探测(pseudo random probing)
        ④双重散列探测(double hashing probing)
    

    8.dynamic resizing

    动态调整,是针对封闭散列的,有两种情况:
    1)当插入新记录到桶数组时,计算桶数组的负载因子(load factor),如果大于一定阈值时,对桶数组的大小进行扩容
    2)当从桶数组中删除记录时,计算桶数组的负载因子(load factor),如果小于一定阈值时,对桶数组的大小进行缩容
    // 扩容和缩容,都需要将旧记录迁移到新的地址上,这就需要对 key 进行重新映射,这种重新映射被称为再哈希(rehash)
    

    9.load factor

    一个评估哈希表的关键统计数据,被定义为:load factor = n / k, n 是记录的数量,k 是桶的数量
    1)随着负载因子的扩大,出现冲突的概率会越来越大,所以当超过一定阈值时,需要扩容,避免哈希表因为频繁处理冲突而越来越慢
    2)随着负载因子的缩小,桶数组中空着的槽就越来越多,所以当小过一定阈值时,需要缩容,避免空槽飙升导致的内存浪费

    10.serialization

    序列化,也被称为编组(marshalling)是将数据结构或对象状态转换为可存储格式的过程(比如将内存中加载的数据比如 map<stirng, int>的一个kv对,转换保存到本地磁盘文件中,比如文件中的一行字符串 stirng \t string(int 2 stirng))序列化的逆过程被称为反序列化(deserialization )或解散(unmarshalling)
    

    [优缺点]
    由上面的术语可知:

    1.开放散列(open hashing)/ 拉链法(针对桶链结构)

    1)优点:
         ①对于记录总数频繁可变的情况,处理的比较好(也就是避免了动态调整的开销)
         ②由于记录存储在结点中,而结点是动态分配,不会造成内存的浪费,所以尤其适合那种记录本身尺寸(size)很大的情况,因为此时指针的开销可以忽略不计了
         ③删除记录时,比较方便,直接通过指针操作即可
    2)缺点:
        ①存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销
        ②如果所有的 key-value 对是可以提前预知,并之后不会发生变化时(即不允许插入和删除),可以人为创建一个不会产生冲突的完美哈希函数(perfect hash function),此时封闭散列的性能将远高于开放散列
        ③由于使用指针,记录不容易进行序列化(serialize)操作
    

    2.封闭散列(closed hashing)/ 开放定址法

    1)优点:
        ①记录更容易进行序列化(serialize)操作
        ②如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的
    2)缺点:
        ①存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升,这在实时或者交互式应用中可能会是一个严重的缺陷
        ②使用探测序列,有可能其计算的时间成本过高,导致哈希表的处理性能降低
        ③由于记录是存放在桶数组中的,而桶数组必然存在空槽,所以当记录本身尺寸(size)很大并且记录总数规模很大时,空槽占用的空间会导致明显的内存浪费
        ④删除记录时,比较麻烦。比如需要删除记录a,记录b是在a之后插入桶数组的,但是和记录a有冲突,是通过探测序列再次跳转找到的地址,所以如果直接删除a,a的位置变为空槽,而空槽是查询记录失败的终止条件,这样会导致记录b在a的位置重新插入数据前不可见,所以不能直接删除a,而是设置删除标记。这就需要额外的空间和操作。
    

    3.哈希表相对于其他数据结构的优缺点

    1)优点:
     记录数据量很大的时候,处理记录的速度很快,平均操作时间是一个不太大的常数
    2)缺点:
        ①好的哈希函数(good hash function)的计算成本有可能会显著高于线性表或者搜索树在查找时的内部循环成本,所以当数据量非常小的时候,哈希表是低效的      
        ②哈希表按照 key 对 value 有序枚举(ordered enumeration, 或者称有序遍历)是比较麻烦的(比如:相比于有序搜索树),需要先取出所有记录再进行额外的排序
        ③哈希表处理冲突的机制本身可能就是一个缺陷,攻击者可以通过精心构造数据,来实现处理冲突的最坏情况。即:每次都出现冲突,甚至每次都出现多次冲突(针对封闭散列的探测),以此来大幅度降低哈希表的性能。这种攻击也被称为基于哈希冲突的拒绝服务攻击(Hashtable collisions as DOS attack)
        // 好的哈希函数是指产生的哈希值是均匀(uniform)分布的,即可均匀分布在桶数组中
       // 最坏的情况下插入数据被称作哈希表的退化(degenerate)
       // 哈希表拒绝服务攻击,可以参考:PHP哈希表碰撞攻击原理 - 文章 - 伯乐在线
    
    展开全文
  • 1.两种查询引擎查询速度(myIsam 引擎) InnoDB 中不保存的具体行数,也就是说,执行...注意的是,当count(*)语句包含 where条件时,两种表的操作有些不同,InnoDB类型的用count(*)或者count(主键),加上w...

    1.两种查询引擎查询速度(myIsam 引擎 )

    InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。

    MyISAM只要简单的读出保存好的行数即可。

    注意的是,当count(*)语句包含 where条件时,两种表的操作有些不同,InnoDB类型的表用count(*)或者count(主键),加上where col 条件。其中col列是表的主键之外的其他具有唯一约束索引的列。这样查询时速度会很快。就是可以避免全表扫描。

    总结:

    mysql 在300万条数据(myisam引擎)情况下使用 count(*) 进行数据总数查询包含条件(正确设置索引)运行时间正常。对于经常进行读取的数据我们建议使用myIsam引擎。

     

    2.百万数据下mysql分页问题

    在开发过程中我们经常会使用分页,核心技术是使用limit进行数据的读取,在使用limit进行分页的测试过程中,得到以下数据:

    select * from news order by id desc limit 0,10
    耗时0.003秒
    select * from news order by id desc limit 10000,10
    耗时0.058秒
    select * from news order by id desc limit 100000,10 
    耗时0.575秒
    select * from news order by id desc limit 1000000,10
    耗时7.28秒
    

    我们惊讶的发现mysql在数据量大的情况下分页起点越大查询速度越慢,100万条起的查询速度已经需要7秒钟。这是一个我们无法接受的数值!

    改进方案 1

    select * from news 
    where id >  (select id from news order by id desc  limit 1000000, 1)
    order by id desc 
    limit 0,10
    

    查询时间 0.365秒,提升效率是非常明显的!!原理是什么呢???

    我们使用条件对id进行了筛选,在子查询 (select id from news order by id desc limit 1000000, 1) 中我们只查询了id这一个字段比起select * 或 select 多个字段 节省了大量的查询开销!

     

    改进方案2

    适合id连续的系统,速度极快!

    select * from news 
    where id  between 1000000 and 1000010 
    order by id desc
    

    不适合带有条件的、id不连续的查询。速度非常快!

    3. 百万数据下mysql条件查询、分页查询的注意事项

    接上一节,我们加上查询条件:

    select id from news 
    where cate = 1
    order by id desc 
    limit 500000 ,10 
    

    查询时间 20 秒

    好恐怖的速度!!利用第一节知识进行优化:

    select * from news
    where cate = 1 and id > (select id from news where cate = 1 order by id desc limit 500000,1 ) 
    order by id desc 
    limit 0,10 
    

    查询时间 15 秒

    优化效果不明显,条件带来的影响还是很大!在这样的情况下无论我们怎么去优化sql语句就无法解决运行效率问题。那么换个思路:建立一个索引表,只记录文章的id、分类信息,我们将文章内容这个大字段分割出去。

    表 news2 [ 文章表 引擎 myisam 字符集 utf-8 ]

    -------------------------------------------------

    id int 11 主键自动增加

    cate int 11 索引

    在写入数据时将2张表同步,查询是则可以使用news2 来进行条件查询:

    select * from news
    where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
    order by id desc 
    limit 0,10
    

    注意条件 id > 后面使用了news2 这张表!

    运行时间 1.23秒,我们可以看到运行时间缩减了近20倍!!数据在10万左右是查询时间可以保持在0.5秒左右,是一个逐步接近我们能够容忍的值!

    但是1秒对于服务器来说依然是一个不能接受的值!!还有什么可以优化的办法吗??我们尝试了一个伟大的变化:

    将 news2 的存储引擎改变为innodb,执行结果是惊人的!

    select * from news
    where cate = 1 and id > (select id from news2 where cate = 1 order by id desc limit 500000,1 ) 
    order by id desc 
    limit 0,10
    

    只需要 0.2秒,非常棒的速度。

     

    4.mysql存储引擎 myIsam和innodb的区别

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。

    MyISAM存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件存放表格定义;数据文件是MYD (MYData);索引文件是MYI (MYIndex)。

    InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如like操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

    核心区别

    MyISAM是非事务安全型的,而InnoDB是事务安全型的。

    MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

    MyISAM支持全文类型索引,而InnoDB不支持全文索引。

    MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

    MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

    InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。

    应用场景

    MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

    InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

    Mysql的存储引擎和索引

    数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将关键字存储到树的节点即可。当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。 这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(clustered index ),一种叫做非聚簇索引(secondary index)。这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。

    InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。

    MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

    为了更形象说明这两种索引的区别,我们假想一个表如下图存储了4行数据。其中Id作为主索引,Name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。

     

    我们重点关注聚簇索引,看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

    1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。

    2 辅助索引使用主键作为"指针" 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置(实现中通过16K的Page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的B+树节点分裂以及Page的分裂),使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。

    所以在百万级数据及更大数据情况下,mysql innoDB 的索引表现更加优秀!

     

    5、MySQL性能优化的一些经验

    a.为查询优化你的查询

    大多数的MySQL服务器都开启了查询缓存。这是提高性能最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。

    这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。

    请看下面的示例:

    // 查询缓存不开启

    $r = mysql_query("SELECT username FROM user WHERE     signup_date >= CURDATE()");

    // 开启查询缓存

    $today = date("Y-m-d");

    $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

    上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。

     

    b.学会使用EXPLAIN

    使用EXPLAIN关键字可以让你知道MySQL是如何处理你的SQL语句的。

    select id, title, cate from news where cate = 1

    发现查询缓慢,然后在cate字段上增加索引,则会加快查询

     

    c.当只要一行数据时使用LIMIT 1

    当你查询表的有些时候只需要一条数据,请使用 limit 1。

     

    d.正确的使用索引

    索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索、拍下、条件,那么,请为其建立索引吧。

     

    e.不要ORDER BY RAND()

    效率很低的一种随机查询。

     

    f.避免SELECT *

    从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。必须应该养成一个需要什么就取什么的好的习惯。

     

    g.使用 ENUM 而不是 VARCHAR

    ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。

    如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

     

    h.使用 NOT NULL

    除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。

    首先,问问你自己“Empty”和“NULL”有多大的区别(如果是INT,那就是0和NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用NULL。(你知道吗?在 Oracle 里,NULL 和 Empty 的字符串是一样的!)

    不要以为 NULL 不需要空间,其需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

     

    下面摘自MySQL自己的文档

    “NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

    i.IP地址存成 UNSIGNED INT

    很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP。如果你用整形来存放,只需要4个字节,并且你可以有定长的字段。而且,这会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP between ip1 and ip2。

    我们必需要使用UNSIGNED INT,因为 IP地址会使用整个32位的无符号整形

     

    j.固定长度的表会更快

    如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。

    固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。

    并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

     

    k.垂直分割

    “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。需要注意的是,这些被分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,这样的性能会比不分割时还要差,而且,会是极数级的下降。

     

    l.拆分大的 DELETE 或 INSERT 语句

    如果在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。

    Apache 会有很多的子进程或线程。所以,其工作起来相当有效率,而我们的服务器也不希望有太多的子进程,线程和数据库链接,这是极大的占服务器资源的事情,尤其是内存。

    如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了。

     

    m.越小的列会越快

    对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问。

     

    n.选择正确的存储引擎

    在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。

    MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

    InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

    转自:https://www.cnblogs.com/llzhang123/p/9239682.html

    展开全文
  • 常见Excel技巧

    万次阅读 2018-12-09 16:31:39
    EXCEL常见技巧锦集 一、基础操作部分: 001、Excel365基础工作界面介绍 002、光标跳转设置、常用的录入技巧 003、多个单元格内容复制到一个单元格中、CTRL+D填充、快速做序列号 004、实时预览、双击格式刷、...

    EXCEL常见技巧锦集

    一、基础操作部分:

    001、Excel365基础工作界面介绍

    002、光标跳转设置、常用的录入技巧

    003、多个单元格内容复制到一个单元格中、CTRL+D填充、快速做序列号

    004、实时预览、双击格式刷、微调字体大小

    005、快速移动、复制、互换位置、凹凸边框制作、给文字添加拼音、斜对齐

    006、利用添加拼音调整单元格内内容的行高

    007、跨列居中、快速选定内容、两栏、三栏表头的制作

    008、自定义数字格式1

    009、自定义数字格式2

    010、自定义格式综合练习题

    011、表格样式

    012、查找某产品最后一次的售价

    013、剪贴板的用处你了解吗?

    014、Excel中的条件格式

    015、条件格式图标集中无法使用相对引用

    016、快速调整行高列宽、F4、快速隔行或者隔列插入或者删除

    017、强大的CTRL+E(仅限13版本以上的excel)

    018、提取实战(CTRL+E)

    019、你真的懂查找和替换吗?

    020、全面了解选择性粘贴

    021、保护工作表的N种方法

    022、数据透视表基础

    023、你该熟练掌握的数据透视表技巧

    024、多重合并数据透视

    025、破解工作表保护密码的黑科技

    026、让你更快一点(F2、CTRL+TAB、ALT+TAB)

    027、单元格内行高调整

    028、你可曾遇见这样的烦恼(被超链接、对齐之缩进)

    029、合并单元格筛选查看技巧

    030、通过查询快速合并多个报表

    031、E表打印技巧

    032、数据验证中不允许输入非法值怎么办?

    033、输入法里深藏的技巧

    034、用查找法快速查看工作表

    035、快速制作工资条的三种办法

    036、高级筛选普及

    037、浏览长表的技巧(冻结行列、单元格、快速返回表头)

    038、让你爽翻了的邮件合并功能

    039、2016版excel新增的几个功能

    040、EXCEL中按方向键光标居然不动了

    041、基本操作练习题(分列,定位)

    042、一次性复制格式同时去掉数据中的公式

    043、一招让以科学计数法显示的数据恢复本来的面貌

    044、给你的Excel设定个允许填写日期(数据验证)

    045、口内打对✔或者✖怎么弄

    046、没保存的文件意外关闭该怎么办

    047、批量提取文件或者是文件夹名的方法

    048、批量在Excel中插入照片

    049、邮件合并批量生成N个文档

    050、邮件合并批量插入对应的照片

    051、批量修改文件名

    052、跨列、跨越居中

    053、在Excel中插入截图的技巧

    054、分列功能里的技巧

    055、Excel中的创建组

    056、根据相同的内容批量合并单元格

    057、账期提醒表

    058、一分钟恢复损毁的EXCEL文件

    059、13个必学的Excel技巧

    060、给excel打印文件添加水印

    061、隐藏单元格的另一种方法

    062、绝妙的引用

    063、一次性编辑多表

    二、函数部分:

    001、Row、Cloumn、Offset、Int(列与矩阵互转)

    002、sum函数经典用法

    003、sumif函数

    004、sumifs函数(多条件求和)

    005、数组思维下的sumifs

    006、强大的sumproduct函数

    007、多条件求和练习题(sumproduct、sumifs、sumif、sum)

    008、if、iferror普及课

    009、工作中需要的不仅仅是四舍五入(round、roundup、rounddown、int)

    010、舍入函数(floor、ceiling)

    011、计数函数大合集

    012、女神(vlookup)驾到,快来迎接

    013、经典的查找函数lookup

    014、lookup的查找原理

    015、字符串中的数字提取(isnumber、match)

    016、字符串中的数字提取进阶!(N^0=1)

    017、求区域中最后一个数字(max、min、mod、indirect、text)

    018、检验下你的水平(区间判断if、lookup、len、lenb)

    019、温故而知新(前面所学函数汇总)

    020、在多表中查询数据(函数中引用工作表的办法)

    021、连续编号的技巧(合并单元格编号,筛选、隐藏行后的编号)

    022、把一列中大分类相同的小分类放到一行的方法

    023、把一列中大分类相同的小分类放到一个单元格中的方法

    024、银行账号间自动加空格

    025、两列中互相重复的数字提醒

    026、时间日期函数(datedif)

    027、人民币小写金额转换大写

    028、练练你的基本功(每个分类编序号、合并单元格求和)

    029、rept、trim函数

    030、知其然也知其所以然(把一行字按照分隔符拆分成一列)

    031、三个简单的一看就会的函数(large、rank、phonetic)

    032、必学的技巧(累计求和、带单位的数字求和、small)

    033、综合练习(从身份证号码中提取生日、性别)

    034、根据填充颜色求和(get.cell、formulatext)

    035、获取演讲比赛成绩的前三名(综合练习)

    036、逆向查询(vlookup、lookup、index+match)

    037、统计区间个数的专属函数(frequency)

    038、循环引用的妙处

    040、高手的玩法(查找综合练习)

    041、隔行隔列求和

    042、提取不重复的值

    043、数据库函数dcount、dcounta

    044、时间函数大全

    045、日期函数大全1

    046、日期函数大全2

    047、条件排名的四种思路

    048、transpose函数

    049、hlookup函数

    050、address函数

    051、打印表中某个单元格按次序引用一列的内容

    052、文本运算式求值

    053、多级下拉菜单的制作

    054、联想式下拉菜单的制作

    055、用excel做个九九乘法表

    056、给你的工作簿做个目录

    057、hyperlink函数

    058、最大公约数函数GCD

    059、最小公倍数函数LCM

    060、去掉一个最高分,去掉一个最低分求平均值(trimmean)

    061、没学quotient之前你是怎么求商数的

    062、检测是否完成任务还可以这样(sign)

    063、int与trunc的区别

    064、求企业连续几年业绩的平均增长率(geomean)

    065、英文字母大小写转化,阿拉伯数字转罗马数字(upper、lower、roman)

    066、product,可曾听说过

    067、随机函数rand、randbetween

    068、用excel做个抽奖器

    069、根据进货、出货求库存(综合练习)

    070、中文数字转化成阿拉伯数字

    071、这就是我为啥老推荐你使用2016版excel的原因(新增的几个函数)

    072、综合练习题(表格自动化)

    073、跨表求和

    074、跨表条件求和

    075、自动在很多表中同时提取该表的表名

    076、函数综合练习(一道可以考考你函数掌握水平的题目)

    077、动态表格的制作

    078、HR常用的Excel技巧

    079、从有重复客户记录的数据源里直接提取排名

    080、按条件从有重复记录的数据中按名次提取数据

    081、显示一行中出现次数最多的字符(code、char、mode)

    082、函数大全(对函数分类做个全面的了解)

    083、抽奖器的制作(照片随名字变动而变动)

    084、分解任务遇到的问题(ceiling、floor、sumif通配符求和)

    085、合并单元格引起的各种困扰

    086、对一组数据中不合格的数据进行计数

    087、根据多个条件查找对应的区间

    088、087文章的答案

    089、一个字符串中是否包含另一个字符串中的几个字符的判断

    090、相对引用与循环引用的实例练习

    091、怎样生成不重复的随机数

    092、用vlookup进行模糊查找

    093、规划求解

    094、一组数据依次相减后求平均

    095、代入式运算式求值

    三、图表部分:

    001、别样的簇状柱形图之系列重叠

    002、别样的簇状柱形图之显示系列差距

    003、别样的簇状柱形图之电池电量图

    004、借助辅助列制作漂亮的柱形图

    005、双层柱形图

    006、堆积柱形图之系列线应用

    007、柱形图之断层图

    008、花式条形图

    009、蝴蝶条形图

    010、折线图添加数据标记和改变线型

    011、传神的散点图

    012、复合条形饼图中条形个数的调整

    013、饼图中会动的图例

    014、百分比堆积面积图的(用公司logo做图例)

    015、雷达图里存在的bug

    016、数据差异较大时用次坐标来调整

    017、甘特图

    018、图表中强调数据的技巧

    019、自定义图表中图形形状

    020、圆环图与柱形图的组合

    021、折线图也可以那么美丽

    022、别样的圆环图

    023、漏斗图

    024、瀑布图

    025、蛇形图--高大上的商务图表

    026、旭日图

    027、树状图

    028、帕累托图

    029、三维气泡图

    030、用气泡图做波士顿矩阵图

    031、动态图表(1)

    032、动态图表(2)

    033、动态图表(3)

    034、动态图表(4)

    035、函数rept也可以做出让你惊喜的图表

    036、小巧的迷你图

    四、图片与图形

    001、你知道Excel里插入的图片和图形居然有这点区别吗?

    002、批量调整插入的图片大小并让其贴到对应的单元格里去

    003、插入正方形、三栏表头的方法

    004、删除背景、简单抠图

    005、提取颜色技巧

     

    转自知乎

    展开全文
  • SPSS软件中常见统计分析方法哪些 大概如下: 卡方检验 (Pearson法、似然比法、精确检验、线性和线性组合等); T检验 (单样本t检验、独立样本t检验、配对样本t检验); 非参数检验 单样本非参数检验:Kolmogorov...

    SPSS软件中常见的统计分析方法有哪些

    大概如下:

    卡方检验

    (Pearson法、似然比法、精确检验、线性和线性组合等);

    T检验

    (单样本t检验、独立样本t检验、配对样本t检验);

    非参数检验

    单样本非参数检验:Kolmogorov-Smirnov;
    两个独立样本非参数检验:Mann-Whitney-U法、Kolmogorov-Smirnov Z法、Moses 极限反应法、Wald-Wolfowitz游程法;
    多个独立样本非参数检验:Kruskal-Wallis H(K)法、中位数法、Jonckheere-Terpstra(J)法;
    两个配对样本非参数检验:Wilcoxon(W)法、符号检验(S)法、Mcnemar(M)法、变价同质性(H)法;
    多个样本配对样本非参数检验:Friedman(F)法、Kendall的W(K)法、Cochran的Q(C)法;

    方差分析

    (单因素方差分析、一元方差分析、多元方差分析、等距/不等距的重复方差分析)

    未完,待续……

    PS:

    刚开始,我们只需要明白什么是独立样本t检验和配对样本t检验,能够帮大家快速适应SPSS统计软件的操作界面和分析环境。

    上面说了很多,还有很多没说,没事。我们目前只要知道有一个t检验的存在就好了。

    莫慌,莫慌,等你回头看的时候,就会觉得是常识,或者似曾相识。
    (2019年8月24日,微信号okjiamai)

    展开全文
  • ),这是业内非常成熟的扩展列的方案(以为大伙都熟悉,没有展开讲,只重点讲了两种新方案,这可能是导致被喷得厉害的源头),今天补充说一下。 以 user(uid, name, passwd) 扩展 到 user...
  • 每年的码农都流去了?

    千次阅读 2013-12-18 12:45:02
    IT民工的毕业去处有哪几类?就员工来说,我觉得按照待遇,大概可以分为以下几类:国外 的offer、国内互联网顶级offer(主要是游戏公司)、银行IT、互联网、华为、运营商、I T软硬件外企、其它通信设备商、IT软硬件...
  • 数学建模13种常见方法

    万次阅读 多人点赞 2018-11-24 10:22:00
    下面来介绍一下数学建模大赛中常用的13中建模方法: 1、层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、...课题时,应用网络系统理论和多目标综合评价方法,提出的一层次权重决策分析方法。 2、多...
  • 列举:中文分词算法你知道几种?

    万次阅读 2017-11-09 20:22:25
    列举:中文分词算法你知道几种? 摘要:看似普通的一句话,甚至几个词,在机器眼里都要经过好几道“程序”。这个过程主要靠中文分词算法,这个算法分为三大类:机械分词算法、基于n元语法的分词算法、基于隐...
  • Oracle的优化器有两种优化方式(一)

    千次阅读 2010-04-15 14:07:00
    Oracle的优化器有两种优化方式(整理), 2010-04-13RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO) 优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句...
  • redis 持久化的两种方式

    万次阅读 多人点赞 2016-05-26 15:16:57
     或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的 莫过于SNAPSHOTTING模式,这个不需要反驳吧,而且你可能还知道,使用...
  • hashmap两种遍历总结!

    千次阅读 2016-07-27 20:06:21
    1.hashmap两种遍历效率1:2----entry----单个遍历两次 public class HashMapTest { public static void main(String[] args) { HashMap keySetMap = new HashMap(); HashMap entrySetMap = n
  • 相关文章:Redis简介以及和其他缓存数据库的区别前言Redis除了可以存储键还可以存储常见的5数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令一部分是可以公用的,但是还有一些其他的命令是...
  • 数据预处理 常见的几方法

    万次阅读 2018-08-20 10:05:14
    在进行决策时,一般要进行属性值的规范化,主要如下三个作用:①属性值多种类型,上述三属性放在同一个中不便于直接从数值大小判断方案的优劣,因此需要对数据进行预处理,使得中任一属性下性能约优的方案...
  • Mysql中使用count加条件统计

    万次阅读 多人点赞 2019-06-02 10:34:26
    最近发现在处理Mysql问题时,count()函数频繁上镜,常常出现在分组统计的情景下,但是时候并不是使用group by分好组就可以直接统计了,比如说一个常见的需求,统计每个班级男生所占的比例,这种情况一般会按照班级...
  • MySQL中的统计数据

    万次阅读 2021-09-06 21:16:28
    基于索引统计数据的成本计算 时候使用索引执行查询时会许多单点区间,例如使用in语句就很容易产生非常多的单点区间,比如下边这个查询(下边查询语句中的…表示还有很多参数): select * from t_emp where ...
  • 8种常见算法比较

    万次阅读 2016-08-09 17:42:38
    8种常见机器学习算法比较 2016-08-04 17:46 转载 陈圳 0条评论 雷锋网(搜索“雷锋网”公众号关注)按:本文转自刘志伟责编,在机器学习中选择一个恰当的算法十分重要,文中主要介绍了8计算机算法...
  • 数据结构——四常见的线性表

    千次阅读 2017-12-14 18:59:18
    数组、链表、栈、队列是四常见的线性表
  • 事务的4隔离级别(Isolation Level)分别是什么? 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获...
  • 统计学——几种常见的假设检验

    千次阅读 2020-04-22 17:50:37
    显著性检验是假设检验中最常用的一方法,也是一最基本的统计推断形式,其基本原理是先对总体的特征做出某种假设,然后通过抽样研究的统计推理,对此假设应该被拒绝还是接受做出推断。常用的假设检验方法Z检验...
  • 哪些网站用爬虫爬取能得到很价值的数据?

    万次阅读 多人点赞 2019-05-05 17:47:07
    1、微信好友的爬虫,了解一下你的好友全国分布,男女比例,听起来似乎是一个不错的想法,当然你还可以识别一下你的好友多少人是用自己照片作为头像的,详细的内容可以点击这里:Python对微信好友进行简单统计分析 ...
  • 测试用例的几种常见设计方法

    千次阅读 2018-04-11 12:30:50
    测试用例的几种常见设计方法 测试用例常见的设计方法:等价类划分法、边界值分析法、错误推测法、判定法、正交实验法。 一.等价类划分法 顾名思义,等价类划分,就是将测试的范围划分成几个互不相交的子集,...
  • PostgreSQL最常见问题

    千次阅读 2010-05-27 14:37:00
    PostgreSQL最常见问题 常见问题1.1)PostgreSQL 是什么?该怎么发音?1.2)PostgreSQL 的版权是什么?1.3)PostgreSQL 可以运行在哪些操作系统平台上?1.4)我从哪里能得到 PostgreSQL?1.5)我从哪里能得到对 PostgreSQL...
  • 种常见的距离计算公式

    万次阅读 2019-10-20 10:41:59
    我们常用的距离计算公式是欧几里得距离公式,但是时候这种计算方式会存在一些缺陷,那么就需要另外的计算方法去加以补充,本文将介绍几在机器学习中常用的计算距离。 在做很多研究问题时常常需要估算不同样本...
  • 种常见的离群点检验方法

    万次阅读 2019-04-19 10:50:18
    在一组平行测定中,若个别数据与平均值差别较大,则把此数据视为可疑值,也称离群值。 如果统计学上认为应该舍弃的数据留用了,势必会影响其平均值的可靠性。相反,本应该留用的数 据被舍弃,虽然精密度提高,但却...
  • 8种常见机器学习算法比较

    万次阅读 多人点赞 2016-10-26 20:35:41
    统计学习框架下,大家刻画模型复杂度的时候,这么个观点,认为Error = Bias + Variance。这里的Error大概可以理解为模型的预测错误率,是有两部分组成的,一部分是由于模型太简单而带来的估计不准确的部分(Bias...
  • 种常见密码形式

    万次阅读 2012-09-25 20:59:05
    1、栅栏易位法。  即把将要传递的信息中...将字母分截开排成行,如下 T E O G S D Y U T A E N N H L N E T A M S H V A E D 再将第二行字母分别放入第一行中,得到以下结果 THE LON
  • cuffdiff 将个样本各三个学重复输入进去出来之后只剩个样本的 geneexp.diff 的差异基因 30000 多个,但是(significant)这一栏意义为 YES 只有 600 多个,正常吗? 答: 这个正常,gene-exp.diff 这个...
  • 种常见的假设检验

    千次阅读 2015-04-29 09:31:17
    假设检验是用来判断样本与样本,样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。其基本原理是先对总体的特征作出某种假设,然后通过抽样研究的统计推理,对此假设应该被拒绝还是接受作出推断。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,268
精华内容 60,107
关键字:

常见的统计表有哪两种?