索引优化的思考

几种索引类型

  • 普通索引
    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=…)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

  • 唯一索引
    普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

  • 主键索引
    在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

  • 外键索引
    如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

  • 复合索引
    索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA,columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A,B,C)可以当做A或(A,B)的索引来使用,但不能当做B、C或(B,C)的索引来使用。

  • 聚簇索引
    聚簇索引是顺序结构与数据存储物理结构一致的一种索引,并且一个表的聚簇索引只能有唯一的一条;

  • 非聚簇索引
    非聚簇索引记录的物理顺序与逻辑顺序没有必然的联系,与数据的存储物理结构没有关系;一个表对应的非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;

建立索引的一些经验

  • 复合索引的建立原则:

    • 如果您很可能仅对一个列多次执行搜索,则该列应该是复合索引中的第一列。
    • 包含多个列的主键始终会自动以复合索引的形式创建索引,其列的顺序是它们在表定义中出现的顺序,而不是在主键定义中指定的顺序。因此对主键执行的搜索,应该确定哪一列应该排在最前面。
    • 请注意,创建复合索引应当包含少数几个列,并且这些列经常在select查询里使用。在复合索引里包含太多的列不仅不会给带来太多好处,而且由于使用相当多的内存来存储复合索引的列的值,其后果是内存溢出和性能降低。
  • 查询优化器在在where查询中的作用:如果一个多列索引存在于列a1和a2上,则以下语句: 查询优化器会试图通过决定哪个索引将找到更少的行。之后用得到的索引去取值。

Select * from table where a1=val1 AND a2=val2;
  • 如果存在一个多列索引,任何最左面的索引前缀能被优化器使用。所以联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面。如:一个多列索引为 (col1 ,col2, col3)那么在索引在列 (col1) 、(col1 col2) 、(col1 col2 col3) 的搜索会有作用。如果列不构成索引的最左面前缀,则建立的索引将不起作用。

  • 如果一个 Like 语句的查询条件不以通配符起始则使用索引。如:%xxx 或 %xxx% 不使用索引。xxx% 使用索引。

  • 尽量不使用不等于操作符(<>, !=)

select * from dept where staff_num <> 1000;//索引失效
select * from dept shere staff_num < 1000 or dept_id > 1000;
发布了57 篇原创文章 · 获赞 1 · 访问量 6590

猜你喜欢

转载自blog.csdn.net/yanyingnan1357/article/details/82290064
今日推荐