zoukankan      html  css  js  c++  java
  • 谈聚集索引,非聚集索引,多列索引,索引覆盖及在sqlite使用。

    聚集索引是物理上连续存在,聚集索引一个表只能有一个,

    非聚集索引是物理存储不连续,逻辑上连续,非聚集索引一个表可以存在多个。按定义,除了聚集索引外的其它索引,都是非聚集索引,如B+索引,hash索引.

    create clustered index  dcity on city(name)    // 创建聚集索引

    create unclustered index dcity on city(name)   // 创建非聚集索引

    Sqlite不支持聚集索引,android默认需要一个”_id”字段,这保证了你插入的数据会按“_id”的整数顺序插入,这个integer类型的主键就会扮演和聚集索引一样的角色。所以不要再在对于声明为:INTEGER PRIMARY KEY的主键上创建索引。

    创建索引的优缺点:

    优点:

    • 大大加快数据的检索速度,这也是创建索引的最主要的原因
    • 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

    缺点:

    • 创建索引需要耗费一定的时间,但是问题不大,一般索引只要build一次
    • 索引需要占用物理空间,特别是聚集索引,需要较大的空间
    • 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度,这个是比较大的问题。

    如何解决索引查询时,两次回表查询问题:用索引覆盖,索引覆盖是指 查询时,一个索引包含了所有我们要查的值,

    多列索引: 对于where子句中出现的列要想索引生效,会有一些限制,这就和前导列有关。所谓前导列,就是在创建复合索引语句的第一列或者连续的多列。比如通过:CREATE INDEX comp_ind ON table1(x, y, z)创建索引,那么x,xy,xyz都是前导列,而yz,y,z这样的就不是。在where子句中,前导列必须使用等于或者in操作,最右边的列可以使用不等式,这样索引才可以完全生效。同时,where子句中的列不需要全建立了索引,但是必须保证建立索引的列之间没有间隙。

     

  • 相关阅读:
    我参与过的开源项目
    chineking / WeiboCrawler / wiki / Home — Bitbucket
    PIL应用之生成验证码图片
    hurl
    Hadoop笔记之安装及伪分布式模式配置
    httpbin(1): HTTP Client Testing Service
    动态规划求编辑距离 残阳似血的博客
    cppreference.com
    sscanf
    在python中定义二维数组
  • 原文地址:https://www.cnblogs.com/songsh/p/7212192.html
Copyright © 2011-2022 走看看