zoukankan      html  css  js  c++  java
  • MySql 前缀索引

    create by:关彦明
    create time:2016-05-24
    -------------------------------------------------------------------------
    前缀索引长度的可选择性
    温故而知新,上班前几分钟,拿起新买的【高性能MySQL】一书,随手翻看,是一段讲前缀索引的,
    之前的记忆里,只有用到列索引,没有用过前缀索引,前缀到底要建多长才合适呢?在什么场景下适用呢?带着问题继续看。
    长度是可以根据现有数据计算出来的,计算SQL1:
    SELECT COUNT(DISTINCT colName)/COUNT(*) FROM tableName
    再用查询语句2计算值对比值:
    SELECT COUNT(DISTINCT LEFT(colName,5))/COUNT(*) FROM tableName
    可以多次修改变量“5”来执行计算出最接近SQL1计算的值,那么这个变量就是前缀索引长度可选择性最佳值

    创建前缀索引:
    ALTER TABLE tableName ADD KEY (colName(7))
    -- 这里的7是通过计算得来的长度
    前缀索引的好处:
    使索引更小,执行更快

    前缀索引的缺点:
    无法使用前缀索引做GROUP BY和ORDER BY,也无法使用前缀索引做覆盖扫描。
     
    前缀索引应用场景:
    1、在一个32位长度字符串ID列上使用8到16位长度的前缀索引,能显著提升性能。
    2、后缀索引,MySql里不支持后缀索引,但我们可以反转存储再使用前缀索引,比如查找某个域名的邮件地址(如*@163.com)
     
    计算转义的列名:
    今天才知道MySql计算列转义后的列名可以用在GROUP BY、HAVING、ORDER BY里,如:
    SELECT LEFT(colName,7) AS newName, COUNT(0) AS amount
    FROM tableName GROUP BY newName  HAVING amount > 1 ORDER BY  amount DESC , newName ASC
    转义后的newName,可以在GROUP BY里引用,也可以在ORDER BY里引用
    而在SQL Server中 是不能这么写的,只能GROUP BY LEFT(colName,7),以前使用SQL Server多,现在用MySql,
    所以很多SQL习惯还是SQL Server的写法,特性的使用还得再深入啊,要不然性能低下还少了好多乐趣。
     
    转载请注明原文地址:http://www.cnblogs.com/guanym/p/5522368.html                       
  • 相关阅读:
    容器
    最大公共子串
    HTTPS复习
    进程同步算法
    Android系统机制
    【springBoot】之快速构建一个web项目
    【springBoot】之概述
    【java】之深入理解JVM
    【java】之equals和==区别
    【AMQ】之JMS Mesage structure(JMS消息结构)
  • 原文地址:https://www.cnblogs.com/guanym/p/5522368.html
Copyright © 2011-2022 走看看