zoukankan      html  css  js  c++  java
  • MySQL联合索引

    1. 在一次查询中,MySQL只能使用一个索引。
    2. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序、分组等。
    3. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影响数据写入性能。因为更新数据的同时,也要同时更新索引。
    4. 最实际的好处当然是查询速度快,性能好。

    MYSQL中常用的强制性操作(例如强制索引)

    https://www.jb51.net/article/49807.htm

    SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …

    建索引参考的原则 : 

    一个表有3列 ,a,b,c 说出3种索引,能够在查询的时候用到 a,b,c,bc,ac,abc .

    abc (a,bc,abc)

    bc (c,bc)

    ca (c)

    用 查询bc 的时候用不到abc和ac 索引。

    使用联合索引应该注意:

    1. MySQL使用联合索引只能使用左侧的部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c时都可以使用索引,但是当条件为b,c时将不会使用索引。这好比一本先根据姓,再根据名进行排序的电话簿,当查找的时候有姓的条件,效率会比没有任何条件高;如果在姓的基础上还有名的条件,效率会更高;但若只有名的条件,电话簿将不起作用
    1. 离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。考虑一种极端的情况,数据表中有100条记录,若INDEX(a,b)中a只有两种情况,而b有100种情况。这样对于查询唯一记录a = …,b = …时,先遍历全部索引看满足a条件的有50个索引节点,接下来还要再一个个遍历这50个索引节点。如果是INDEX(b,a),先遍历全部索引发现满足b条件的索引节点只有一个,再遍历这个节点发现也满足a条件。虽然最后都能找到那个唯一的索引节点,但是第二种索引顺序对引擎遍历索引效率有很大的提高(用电话薄的思想去思考问题)
    2. 查看列的离散程度:select count(distinct customer_id),count(distinct staff_id) from payment;

    这里写图片描述

    customer_id列的离散程度更高,建联合索引时应该INDEX(customer_id,staff_id);

    ex:

     

     

  • 相关阅读:
    Comet OJ
    BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学
    BZOJ 3887: [Usaco2015 Jan]Grass Cownoisseur tarjan + spfa
    BZOJ 3357: [Usaco2004]等差数列 动态规划
    BZOJ 3043: IncDec Sequence 差分 + 思维
    BZOJ 2288: 【POJ Challenge】生日礼物 贪心 + 堆 + 链表
    BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 LCA + 树的直径
    爬虫模拟有道字典进行翻译,还发现了一条好玩的js
    django-orm框架表单的增删改查
    数据库的备份,迁移
  • 原文地址:https://www.cnblogs.com/datang6777/p/6933104.html
Copyright © 2011-2022 走看看