[MySQL의 상세한 분석 상세한 인덱스 (색인 개념 여섯 개 인덱스 유형, 키 인덱스의 차이 및 다른 색인)

[MySQL의 상세한 분석 상세한 인덱스 (색인 개념 여섯 개 인덱스 유형, 키 인덱스의 차이 및 다른 색인)
MySQL의 인덱스 개념 :
  • 특별한 인덱스 파일 참조 데이터 테이블의 모든 레코드에 대한 포인터를 포함, (InnoDB의 테이블에 인덱스 테이블 스페이스의 일부입니다)입니다. 말 더 인기, 데이터베이스 인덱스 카탈로그의 앞에 책처럼, 당신은 데이터베이스 쿼리 속도를 속도를 높일 수 있습니다 .
  • 클러스터 된 인덱스, 클러스터되지 않은 인덱스 : 인덱스로 구분된다. , 클러스터 된 인덱스는 클러스터 인덱스가 동일하지 않은 대신, 순차로 데이터의 물리적 위치에 따라 저장되는 클러스터 된 인덱스 의 복수 행, 검색의 속도를 개선 할 수 : 클러스터되지 않은 인덱스 신속 일렬 입수가.
  • 동일한 업데이트 각 인덱스 파일을 필요로하기 때문에 너무 많은 업데이트와 삽입 인덱스의 설립, 속도에 영향을 미칠 것이라는 점을 주목해야한다. 업데이트하고이 단어에 대한 필요가 조금 사용하는 인덱스 형 없으며, 상대적으로 작은 테이블, 종류의 오버 헤드가 크지 않다 테이블을 삽입하는 일반 필요를 들어, 추가 인덱스를 만들 필요가 없습니다.
인덱스 유형 :
  1. 일반 인덱스
  2. 고유 인덱스
  3. 전체 텍스트 색인
  4. 별도의 인덱스
  5. 멀티 컬럼 인덱스
  6. 공간 인덱스
 1. 기본 구문 구조의 데이터 테이블 인덱스를 만들기 ':이 문서를 설명하기위한 실시 형태를 만들기]
2. 기본 문법 구조 '지수는 직접 만든'
3 기본 구문 구조 '수정 테이블 구조는 인덱스 추가'를 :
 
 
인덱스를 삭제합니다 :
 
인덱스 이름의 의미 속성 :
  • UNIQUE : (UNIQUE), 선택적 매개 변수 인덱스가 고유 인덱스임을 나타냅니다.
  • FULLTEXT : (FULLTEXT)는 선택적 매개 변수는 전체 텍스트 인덱스에 대한 인덱스입니다.
  • 공간 (공간)를 선택적 파라미터 인덱스는 공간 인덱스를 나타낸다.
  • 색인 | KEY (인덱스 | 키), 필수 매개 변수를 사용자가 선택하는이 두가에서 선택할 수 있습니다 때, 인덱스 필드를 지정하는 데 사용됩니다.
  • [인덱스 이름] : 선택적 매개 변수, 누구의 역할에 새 이름을 취할 인덱스를 생성하는 것입니다. (편의를 목적으로 플레이)
  • 선택된 필드 이름 : 필수 파라미터는 필드 이름에 대응하는 인덱스로서 사용되며, 필드에 미리 정의되어야한다.
  • 길이 : 선택적 매개 변수는 문자열 형식의 길이를 참조하는 인덱스를 사용할 수있다. (예 : 전화 번호)
  • [오름차순이 | DESC] (ASC | DESC), 선택적인 매개 변수, ASC 오름차순을 나타내고, DESC 내림차순 나타낸다.
먼저, 일반 인덱스 작성
[| FULLTEXT | SPATIAL UNIQUE] 및 기타 매개 변수 제약 조건을 일반 인덱스 추가 할 필요를 만듭니다.
  • 일반 지수 (정의 키워드 KEY 또는 INDEX에 의한 인덱스) 만 작업하는 데이터에 대한 액세스 속도를 .
  • 만 '쿼리'에 가장 자주 발생하는 데이터의 그 열에 대한 인덱스를 만들 수 있습니다 (WHERE 열 = ...) 또는 '정렬'에서 (열 BY ORDER).
  • 가능하면 (예를 int 정수 데이터 형식 열 등) 가장 컴팩트 한 데이터 열 인덱스를 만들려면 가장 깔끔하게 데이터를 선택해야합니다.
예 : 테이블 이름 점수 데이터 테이블을 만들고 테이블의 id 필드 기반 의 이름 score_id 다음과 같이 '일반 인덱스', SQL 문은 다음과 같습니다
 
자세한 예 :
 
테이블의 구조 점수 :
알 수있는 바와 같이, id 필드는 score_id 인덱스의 이름이 생성되었습니다.
구현 계획 일에 걸쳐 점수 테이블 ID는 = 데이터 :
와 키 값이 possible_keys이  score_id 설명  score_id  인덱스가 이미 존재하고 사용하기 시작했다.
참고 : 기본 키 기본 키를 설정하는 경우
 
score表的结构:
可以看出,id 字段上已经创建了一个名称为 score_id 的索引和 PRIMARY 的主键。
score表中id=1的数据的整个执行计划:
说明  score_id  索引已经存在,但已经开始被使用的是  PRIMARY 的主键。
二、唯一索引  创建
创建唯一索引时,使用 UNIQUE 参数对 INDEX | KEY 进行约束。
  • 与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
  • 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。
  • 事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
  • 主索引:在前面已经反复多次强调过!必须为主键字段创建一个索引,这个索引就是所谓的"主索引"。
  • 主索引 与 唯一索引的唯一区别是前者在定义时使用的关键字是PRIMARY而不是UNIQUE。 
例:创建的表名为 address 的数据表,并在该表的 id 字段上建立名称为 address_id 的 ' 唯一索引 ',SQL语句如下:
 
三、全文索引  创建
全文索引只能作用在  CHAR、VARCHAR、TEXT、类型的字段上。创建全文索引需要使用  FULLTEXT  参数进行约束
  • MySQL从3.23.23版开始支持全文索引和全文检索,fulltext索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。
  • 对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
  • 文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。 
  • 这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用命令添加
  • 有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法: 
   SELECT * FROM table_name 
   WHERE MATCH(column1, column2) AGAINST('word1', 'word2', 'word3')
  • 上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
例:创建的表名为 cards 的数据表,并在该表的 name 字段上建立名称为 cards_number 的 ' 全文索引 ',SQL语句如下:
 
四、单列索引  创建
创建单列索引,即在数据表的单个字段上创建索引。创建该类型索引不需要引入约束参数,用户在建立时只需要指定单列字段名,即可创建单列索引。
  •  多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
例:创建的表名为 telephone 的数据表,并在该表的 tel 字段上建立名称为 tel_num 的单列索引,SQL 语句如下:
 
五、多列索引  创建
创建多列索引,即在数据表的多个字段上创建索引。与上述单列索引类似,创建该类型索引不需要引入约束参数。
  •  多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
例:创建的表名 information 的数据表,并在该表的 name 和 sex 字段上建立名称为 info 的多列索引,SQL 语句如下:
 
注意:在多列索引中,只有查询条件中使用了这些字段中的第一个字段(即上面示例中的 name 字段),索引才会被使用。
触发多列索引的条件是用户必须使用索引的第一字段,如果没有用到第一字段,则索引不起任何作用,用户想要优化查询速度,可以应用该类索引形式。
例:组合(复合)索引 ---(‘最左前缀’原则)
针对 title 和 time 建立一个组合索引:alter table info add index `index_title_time` (`title`(50),`time`(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
     –title,time
     –title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:
使用到上面的索引:
SELECT * FROM article WHREE title='测试' AND time=1234567890;
SELECT * FROM article WHREE title='测试';
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;
六、空间索引  创建
创建空间索引,需要添加 SPATIAL 参数进行约束。
同样,必须说明的是,只有 MyISAM 类型的表支持该类型 ‘ 空间索引 ’。而且,索引字段必须有非空约束。
创建的表名 list 的数据表,并在该表的 goods 字段上建立名称为 listinfo 的空间索引,这里 goods 字段有非空约束,符合条件,SQL 语句如下:
 
注意: goods 字段上已经建立名称为 listinfo 的空间索引,其中 goods 字段必须不能为空,且数据类型是 GEOMETRY,该类型是空间数据类型。
空间类型不能用其他类型代替,否则在生成空间素引时会产生错误且不能正常创建该类型索引。 
 
**外键索引**: 如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。 
 
另外:INDEX | KEY:(index | key), 必选参数,用于指定字段为索引的,用户在选择时,只需要二选一即可。
具体什么时候选 INDEX  ,什么时候选 KEY ?
参照两者区别:
1). key是数据库的物理结构它包含两层意义:一是约束(偏重于约束和规范数据库的结构完整性)二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等。
  primary key 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key上建立了一个index;
  unique key 也有两个作用,一是约束作用(constraint),规范数据的唯一性,但同时也在这个key上建立了一个index;
  foreign key也有两个作用,一是约束作用(constraint),规范数据的引用完整性,但同时也在这个key上建立了一个index;
2). index是数据库的物理结构它包含一层意义:它只是索引(辅助查询用的)它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。
  因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。
3). 最后的释疑
    1. 我们说索引分类,分为主键索引、唯一索引、普通索引(这才是纯粹的index)等,也是基于是不是把index看作了key。
  比如 create table t(id int, unique index inx_tx_id  (id));  --- index当作了key使用,因为前面的 unique 赋予了 ‘约束’,使其具有和 key 一样的作用。
    2. 最重要的也就是,不管如何描述,理解index是纯粹的index,还是被当作key,当作key时则会有两种意义或起两种作用。
 

추천

출처www.cnblogs.com/wulw829/p/11316562.html