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

    index(a, b, c) 为例:

    语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要)
    WHERE a=3 只用到了a列 只走了a板子
    WHERE a=3 AND b=5 使用了a、b列 只走了ab两块板子
    WHERE a=3 AND b=4 AND c=5(不论顺序) 使用了a、b、c列 走了所有的板子
    WHERE b=4 AND c=5 或 WHERE b=4 因为a板子没走,所以衔接不上b和c板子
    WHERE a=3 AND c=5 用到a,没用到c 只走了a,b没走就衔接不上c
    WHERE a=3 AND b>10 AND c=7 用到了a、b列 走完了a,b走了一半,与c衔接不上了
    WHERE a=3 AND b LIKE '***%' AND c=7 用到了a、blie 走完了a,b走了前一半,与c衔接不上了
    WHERE a=3 AND b LIKE '%***' AND c=7 只用到了a列 走完了a,b走了后一半,但b前半段与a衔接不上了,走也是白走
    WHERE a=3 AND c>10 AND b=4 用到了a、b、c列 走完了a和b,c只走了一半

    注意:1)例子里都是 WHERE 语句,但 ORDER BY/GROUP BY 等都会用到索引,分析与上面一样

            2)MySQL会一直向右匹配,直到查询中遇到范围查询(<、>、between、like)等就停止匹配

            3)具体分析用explain语句,详细参见http://www.zixue.it/thread-9218-1-1.html

    一道面试题:

    有商品表,商品id列goods_id,栏目列cat_id,价格列price。

    问题:已在价格列上添加索引,但按价格查询还是很慢,为什么?怎么解决?

    答:在实际场景中,一个电商网站的商品很多,用户很少上来就按价格查询,一般会进到分类或品牌下再进行查询。

    解决方法:去掉单独的price列的索引,增加(cat_id,price)复合索引。

                  如果根据日志统计发现许多人按照品牌来查询,也可以改为(cat_id,brand_id,price)复合索引

  • 相关阅读:
    ubuntu下查看环境变量
    ubuntu关闭自动更新、打开 ubuntu 的 apport 崩溃检测报告功能
    Ubuntu 配置AP总结
    ubuntu 12.04亮度无法调节和无法保存屏幕亮度解决办法(echo_brightness)
    Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
    Linux下添加硬盘,分区,格式化详解
    Eclipse启动分析
    “蚁族” 的生活方式画像
    Ubuntu下的防火墙
    Ubuntu下的杀毒
  • 原文地址:https://www.cnblogs.com/liuq/p/6495288.html
Copyright © 2011-2022 走看看