• MySQL 索引


    1、为什么会有索引
    当数据保存在磁盘介质上时,它是作为数据库存放的,每条数据是作为一个整体存储的。磁盘存放数据的数据结构类似于链表,即,每个节点除了包含本身数据,还包含一个指向下个节点的指针。相关数据逻辑相连,物理地址可以任意。
    那么问题来,如果一个表有10W个数据,如果没有索引,那么当你按某个条件查找数据时候,系统只能遍历数据,直到找到你需要的数据。
    如果你把这个字段做成了索引,系统会把这个索引字段按照一定的规则制成一个单独的数据结构,当你需要按照这个字段查找时候,系统会在这个索引数据结构二分查找,把原来复杂度为o(N)降为o(log2N),大大提高查询速度。
    2、索引
    2.1 单列索引
    2.1.1 普通索引
    普通索引是最基本的索引。由关键字KEY或INDEX定义的索引,加快对数据的访问速度。对于那些经常的查询条件(WHERE column=)或排序条件(ORDER BY column)的字段,应该创建索引。
    CREATE INDEX 索引名 ON 表名(字段名);
     
    ALTER TABLE 表名 ADD KEY 索引名(字段名);
    ALTER TABLE 表名 ADD INDEX 索引名(字段名);
    2.1.2 唯一索引
    普通索引允许在数据列中包含重复的值,比如,名字,这个项可以重复。对于一些不能重复的值,比如,个人的身份证号,应该设置为UNIQUE INDEX 把他设置为唯一索引。
    ALTER TABLE people ADD UNIQUE INDEX 索引名(字段名);
    2.1.3 主索引
    主键会被默认添加一个索引,这就是“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。主键索引一定是唯一性索引,唯一性索引不一定是主键索引。
     
    ALTER TABLE people ADD PRIMARY KEY 索引名(字段名);
    2.2 组合索引
    包含多个字段的索引。
     
    CREATE INDEX 索引名 ON 表名(字段名,字段名);
     
    例如:
      CREATE INDEX all_index ON people(last_name,first_name,gender);
     
     
    在使用查询的时候遵循MySQL组合索引的“最左前缀”,什么是最左前缀:where 时的条件要按照建立索引时候字段的排序方式。比如,INDEX(A,B,C)可以被当做A或(A,B)的索引来使用,但不能当做B,C或(B,C)的索引来使用。
    Where A= ‘xxx’ and B like = ‘aa%’ and C=’sss’ 改查询只会使用索引中的前两列,因为like是范围查询。范围查询不算在索引内,因为索引使用 hash值来计算,模糊条件无法计算得到hash值。
     
    2.3 全文索引
    文本字段(text、blog)建立索引时候需要指明索引的长度。如果对文本字段进行模糊查询,即 where column like '%xx%',因为是模糊查询,所以索引会失效。
    可以设置全文索引:
     
    ALTER TABLE 表名ADD FULLTEXT(字段名1, 字段名2)
     
    有了全文索引,就可以利用索引来进行关键字查询了。
     
    ELECT * FROM tablename WHERE MATCH(column1, column2) AGAINST(‘xxx′, ‘sss′, ‘ddd′)
     
    查询出column1 和 column2 中包含这些关键字的记录。
     
  • 相关阅读:
    POJ 3683 Priest John's Busiest Day (2-SAT+输出可行解)
    Codeforces #2B The least round way(DP)
    避免死锁的银行家算法C++程序实现
    源代码编译安装MySQL5.6.12具体过程
    Android 设计模式
    Java与设计模式-适配器模式
    Java和Flex整合报错(五)
    三层架构—再思考
    怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?
    找出你的短板
  • 原文地址:https://www.cnblogs.com/moongeek/p/7452729.html
Copyright © 2020-2023  润新知