精华内容
下载资源
问答
  • 一、索引类型 1、普通索引:基本索引,没有任何...在表中定义主键将自动创建主键索引,主键索引是唯一索引的特定类型能为NULL值,一个表只能有一个primary key索引。 4、全文索引 二、创建索引(三种方式)...

    一、索引类型

    1、普通索引:基本索引,没有任何限制

    2、唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引,可以有NULL值

    3、主键索引:数据库中表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在表中定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。不能为NULL值,一个表只能有一个primary key索引。

    4、全文索引 

    二、创建索引(三种方式)

    1、适用于表创建完毕之后再添加,可以添加的类型有:unique、primary key、index、 fulltext

     ALTER  TABLE  table_name  ADD  INDEX  'index_name'('column_name');

     ALTER   TABLE  table_name  ADD  UNIQUE  'index_name'('column_name');

     ALTER   TABLE  table_name  ADD  PRIMARY KEY  'index_name'('column_name');

     ALTER   TABLE  table_name  ADD  FULLTEXT KEY  'index_name'('column_name');

     

    2、对表增加普通索引或unique索引(只能添加这两种)

    CREATE INDEX 'index_name' ON  table_name('column_name');

    CREATE UNIQUE INDEX 'index_name' ON  table_name('column_name');

     

    3、在建表时添加索引

     CREATE TABLE 'test1'(

    'id'  smallint(5) unsigned auto_increment not null,

    'username' varchar(64) not null comment '用户名',

    'nickname'  varchar(50) not null comment '昵称',

    'intro'  text,

    primary key('id'),

    unique key 'unique1'('username'),

    key  'index'('nickname'),

    fulltext key 'intro'('intro')

    )engine=MyISAM  auto_increment=4 default charset=utf-8

     

    删除索引

    1、ALTER TABLE 'table_name'  DROP INDEX 'index_name';

    2、DROP INDEX 'index_name' on 'table_name'

    删除主键索引

    ALTER TABLE 'table_name' DROP primary key;

    查看索引

    show  index from table_name;

     

    *如果从表中删除某列,则索引会受影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    索引的优缺点:1、索引可以加快查询速度  2、同样会降低写速度   3、表中索引越多,表的体积越大,占用的磁盘空间越大。

    所以并不是索引数量越多越好。

     

     

    展开全文
  • ES默认是动态创建索引和索引类型的mapping。这就相当于无需定义Solr中Schema,无需指定各个字段索引规则就可以索引文件,很方便。但有时方便就代表着灵活。比如,ES默认一个字段是要做分词,但我们有时要...

    ES默认是动态创建索引和索引类型的mapping的。这就相当于无需定义Solr中的Schema,无需指定各个字段的索引规则就可以索引文件,很方便。但有时方便就代表着不灵活。比如,ES默认一个字段是要做分词的,但我们有时要搜索匹配整个字段却不行。如有统计工作要记录每个城市出现的次数。对于NAME字段,若记录“new york”文本,ES可能会把它拆分成“new”和“york”这两个词,分别计算这个两个单词的次数,而不是我们期望的“new york”。

    这时,就需要我们在创建索引时定义mapping。假设索引叫index_name,索引类型的名字叫index_type,编写mapping文件如下(注意:mapping文件中,index_type必须与实际索引当中的索引类型完全一致。):

    {

    "index_type":{

    "properties":{

    "ID":{

    "type":"string",

    "index":"not_analyzed"

    },

    "NAME":{

    "type":"string",

    "fields":{

    "NAME":{

    "type":"string"

    },

    "raw":{

    "type":"string",

    "index":"not_analyzed"

    }

    }

    }

    }

    }

    }

    以上文件是说我们对于index_type这个索引类型,定义了它的mapping。重点是将NAME这个字段映射为两个,一个是需要做索引分析的NAME,另一个是不分析的raw,即不会拆分new york这种词组。这样我们在做搜索的时候,就可以对NAME.raw这个字段做term aggregation,获得所有城市出现的次数了。term aggregation的REST方式的请求编写如下:

    {

    "query": {

    "match_all": {}

    },

    "aggregations": {

    "cityAggs": {

    "terms": {

    "field": "NAME.raw"

    }

    }

    }

    }

    由于我使用的是Windows开发机,强烈推荐安装Elasticsearch Head来做测试,比命令行Curl方便多了。Elasticsearch Head的安装很简单,进入ES的bin目录,执行

    plugin -install mobz/elasticsearch-head

    具体实现时,编写JAVA代码创建索引index_name,创建索引类型index_type指定这个mapping的方法如下

    //省略读取mapping文件的java代码,内容保存在mapping_json中。

    Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));

    client.admin().indices().prepareCreate("index_name").execute().actionGet();

    client.admin().indices().preparePutMapping("index_name").setType("index_type").setSource(mapping_json).execute().actionGet();

    展开全文
  • 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。...1.创建索引 复制代码代码如下: CREATE INDEX indexName ON mytable(username(length)); 如果是CHA

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    MySQL索引类型包括:

    一、普通索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    1.创建索引

    复制代码代码如下:

    CREATE INDEX indexName ON mytable(username(length));

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

    2.修改表结构

    复制代码代码如下:


    ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定

    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   ); 

    -- 删除索引的语法:

    DROP INDEX [indexName] ON mytable;

    二、唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    复制代码代码如下:

    CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
    -- 修改表结构
    ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 
    -- 创建表的时候直接指定
    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length))   );

    三、主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

    复制代码代码如下:

    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   );

    当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    四、组合索引

    为了形象地对比单列索引和组合索引,为表添加多个字段:

    复制代码代码如下:

    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  ); 

    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

    复制代码代码如下:

    ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]
    建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

    如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

    usernname,city,age   usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
    [code]
    SELECT * FROM mytable WHREE username="admin" AND city="郑州"  SELECT * FROM mytable WHREE username="admin"

    而下面几个则不会用到:

    复制代码代码如下:


    SELECT * FROM mytable WHREE age=20 AND city="郑州"  SELECT * FROM mytable WHREE city="郑州"

    五、建立索引的时机

    到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:

    复制代码代码如下:

    SELECT t.Name  FROM mytable t LEFT JOIN mytable m    ON t.Name=m.username WHERE m.age=20 AND m.city='郑州'

    此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。

    刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:

    复制代码代码如下:


    SELECT * FROM mytable WHERE username like'admin%'


    而下句就不会使用:

    复制代码代码如下:

    SELECT * FROM mytable WHEREt Name like'%admin'

    因此,在使用LIKE时应注意以上的区别。

    六、索引的不足之处

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:

    1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

    2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

    索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

    七、使用索引的注意事项

    使用索引时,有以下一些技巧和注意事项:

    1.索引不会包含有NULL值的列

    只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

    2.使用短索引

    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    3.索引列排序

    MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    4.like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

    5.不要在列上进行运算

    复制代码代码如下:


    select * from users where YEAR(adddate)<2007;

    将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:

    复制代码代码如下:

    select * from users where adddate<‘2007-01-01';

    6.不使用NOT IN和<>操作

    以上,就对其中MySQL索引类型进行了介绍。希望对大家有所帮助。


    7.如果WEHERE子句的查询条件里有不等号(WHERE coloum != …)MySQL将无法使用索引。
    类似地,如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = …)MySQL也将无法使用索引。
    JOIN操作中(需要从多个数据表提取数据时)MySQL只有在主键和外键的数据类型相同时才能使用索引。
    如果WHERE子句的查询条件里使用比较操作符LIKEREGEXPMySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说, 如果查询条件是LIKE ‘abc%’MySQL将使用索引;如果查询条件是LIKE ‘%abc’MySQL将不使用索引。
    ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快 ORDER BY方面也没什么作用)
    如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如”0/1″”Y/N”等值,就没 有必要为它创建一个索引。


     

    展开全文
  • ES默认是动态创建索引和索引类型的mapping。这就相当于无需定义Solr中Schema,无需指定各个字段索引规则就可以索引文件,很方便。但有时方便就代表着灵活。比如,ES默认一个字段是要做分词,但我们有时要...

    ES默认是动态创建索引和索引类型的mapping的。这就相当于无需定义Solr中的Schema,无需指定各个字段的索引规则就可以索引文件,很方便。但有时方便就代表着不灵活。比如,ES默认一个字段是要做分词的,但我们有时要搜索匹配整个字段却不行。如有统计工作要记录每个城市出现的次数。对于NAME字段,若记录“new york”文本,ES可能会把它拆分成“new”和“york”这两个词,分别计算这个两个单词的次数,而不是我们期望的“new york”。

    这时,就需要我们在创建索引时定义mapping。假设索引叫index_name,索引类型的名字叫index_type,编写mapping文件如下(注意:mapping文件中,index_type必须与实际索引当中的索引类型完全一致。):

    {	
    	   "index_type":{  
    		  "properties":{  
    			 "ID":{  
    				"type":"string",  
    				"index":"not_analyzed"   
    			 },  			 
    			 "NAME":{
    				"type":"string",
    				"fields":{
    					"NAME":{
    						"type":"string"
    					},
    					"raw":{
    						"type":"string",
    						"index":"not_analyzed"	
    					}
    				}					
    			 } 		 	 		
    		  }  
    	   }   
    }

    以上文件是说我们对于index_type这个索引类型,定义了它的mapping。重点是将NAME这个字段映射为两个,一个是需要做索引分析的NAME,另一个是不分析的raw,即不会拆分new york这种词组。这样我们在做搜索的时候,就可以对NAME.raw这个字段做term aggregation,获得所有城市出现的次数了。term aggregation的REST方式的请求编写如下:

    {
      "query": {
        "match_all": {}
      },
      "aggregations": {
        "cityAggs": {
          "terms": {
            "field": "NAME.raw"
          }
        }
      }
    }

    221107_m3xF_2242064.png

    由于我使用的是Windows开发机,强烈推荐安装Elasticsearch Head来做测试,比命令行Curl方便多了。Elasticsearch Head的安装很简单,进入ES的bin目录,执行

    plugin -install mobz/elasticsearch-head


    具体实现时,编写JAVA代码创建索引index_name,创建索引类型index_type指定这个mapping的方法如下

    //省略读取mapping文件的java代码,内容保存在mapping_json中。
    Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
    client.admin().indices().prepareCreate("index_name").execute().actionGet();
    client.admin().indices().preparePutMapping("index_name").setType("index_type").setSource(mapping_json).execute().actionGet();



    转载于:https://my.oschina.net/u/2242064/blog/508280

    展开全文
  • 普通索引:index,单字段/多字段,可存在多个,列值or组合列值无限制唯一索引:unique index,单字段/多字段,可存在多个,列值or组合列值可重复,但可以为NULL重复,因为NULL值记录不会被添加到索引........
  • ES默认是动态创建索引和索引类型的mapping。这就相当于无需定义Solr中Schema,无需指定各个字段索引规则就可以索引文件,很方便。但有时方便就代表着灵活。比如,ES默认一个字段是要做分词,但我们有时要...
  • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度。所有mysql列的类型可以使用索引,例如:数据库...如果在num列上创建索引,mysql需要任何扫描,直接在索引里...
  • PostgreSQL中的索引名称>索引名称在单个数据库架构中是唯一的.>... (逻辑上讲.)如果您关心索引的名称,可以让Postgres自动命名它:CREATE INDEX ON tbl1 (col1)是(几乎)相同CREATE INDEX t...
  • 清楚数据表字段数据分布情况下,应该创建什么类型的索引?个人觉得以上两种都太适用,可以尝试使用第3类的索引: 3.倒排索引,在搜索引擎使用较多,适用于大多数情况。 使用普通文本文件格式存储倒排...
  • mysql原生并支持json列中属性索引,但是我们可以通过mysql虚拟列间接为json中某些属性创建索引,原理就是为json中属性创建虚拟列,然后通过给虚拟列建立索引,从而间接给属性创建了索引。 在MySQL ...
  • 在数据库设计时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int、timestamp、datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好呢?飘易就这个问题,来一个实践出...
  • MySQL创建索引的方法

    2019-08-10 00:12:02
    创建索引 如果是CHAR,VARCHAR类型,length可以小于字段实际长度 如果是BLOB和TEXT类型,必须指定 length。所以大多数情况下需要指定length 用ALTER TABLE最多 一、CREATE INDEX方法 CREATE INDEX <...
  • 所有MySQL 列类型可以索引,对相关列使用索引是提高SELECT 操作性能最佳途径。create index cityname on city(city(10)); 为city表创建10个字节前缀索引。drop index cityname on city; 删除city表上的索引...
  • MySQL的索引有两种分类方式:逻辑分类和物理分类。 按照逻辑分类,索引可分为: 主键索引:一张表只能有...普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许NULL值插入;...
  • 索引的定义:查询方式通常有两种:一种是:全表扫描;一种是:利用数据表上建立的索引进行扫描。这时候就需要索引了!摘自某教材给出定义:索引就一种特殊的查询表,数据库的搜索引擎...索引的类型:1.普通索引:...
  • 重要: (1) SQL如果创建时候,指定类型那么默认是非聚集索引 (2) 聚集索引和非聚集索引都可以有重复记录,唯一索引能有重复记录。 (3) 主键 默认是加了唯一约束聚集索引,但是也可以在...为列创建索引实...
  • MySQL创建索引语法

    2019-10-02 01:02:36
    1.介绍:   所有mysql索引列类型可以被索引,对来相关类使用索引... mysim和innodb存储引擎表默认创建索引都是btree索引,目前mysql还支持函数索引,但支持前缘索引,对字段前N个字符创建索引 2.mysql创...
  • 多个字段创建索引时,只有在创建索引时,使用索引的第一个字段,一般在创建表时,创建索引 4.主键索引 一张表只有一个主键,且能为空值 5.全文索引 用来查找关键字,在部署时直接与索引中的值相比较 ...
  • 索引的类型及分类

    2019-10-02 12:33:37
    一、索引方法Mysql目前主要有以下几种索引类型...其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。 全文索引并不是和MyISAM一起诞生,它出...
  • 创建高性能的索引

    千次阅读 2019-11-17 17:41:34
    索引基础 索引:存储引擎用于快速找到记录的一种数据结构...索引的类型 B-Tree索引 可以使用B-Tree索引的查询类型: 全值匹配 匹配最左前缀 匹配列前缀 匹配范围值 精确匹配某一列并范围匹配另外一列 只访问索引的...
  • 索引分类: 主键索引: 能为null,唯一索引可以为null 单值索引: 单列,每个表...创建索引: 一、create 索引类型 索引名 on 表 单值: create index dep_index on tb(dept); 唯一 create unique index...
  • 所有MySQL 列类型可以索引,对相关列使用索引是提高SELECT 操作性能最佳途径。create index cityname on city(city(10)); 为city表创建10个字节前缀索引。drop index cityname on city; 删除city表上的索引...
  • 创建和查看索引 创建索引是指在某个表一列或多列上建立一个索引,以便提高对表访问速度...该类型的索引可以创建在任何数据类型的字段上。 创建表时定义索引 CREATE TABLE tablename( propname1 type1, propname2 t
  • 一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。...
  • mysql explain使用:http://blog.csdn.net/kaka1121/article/details/53394426 索引类型在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表代码如下:CREATE TABLE mytable( ID ...
  • 1 索引的类型UNIQUE唯一索引不可以出现相同的值,可以有NULL值。INDEX普通索引允许出现相同的索引内容。PRIMARY KEY主键索引不允许出现相同的值,且不能为NULL值,一个表只能有一个primary_key索引。fulltext index ...
  • 二:如何创建索引(数据库)结构?三:如何向已有索引(数据库)中添加类型(表)结构?四:如何向已有类型(表)中添加新字段?五:如何更改现有类型(表)中字段类型?六:如何删除索引(数据库)?七:如何删除索引中某一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,526
精华内容 1,010
关键字:

不可以创建索引的类型