varbinary(255)
二进制字符串,对这样的字段怎么样创建最优索引,在VARCHAR(255)类型里,可以用最左前缀,如LEFT 4的DISTINCT数量最多,那么可以创建索引INDEX NAME(4),这样的。1:对于varbinary是否也适应?
2:varbinary类型的,有什么办法可以查看到明文?

解决方案 »

  1.   

    1、不适用
    varbinary的长度是字节长度,保存的是二进制字符串
      

  2.   

    VARBINARY 存储的是二进制串,你所谓的明文是什么?比如二进制串  0011 0001,是HEX31 其中的一种理解为ASCII字符 ‘1’, 但如果是0000 0000 0001 0011  你希望它的原文是什么呢?对于BINARY要事先确定它是什么内容,然后才能讨论其对应的原义。
      

  3.   

    感谢榔头哥的回答。还有个问题:
    a,b,c三个字段,在查询的时候有where a=100,也有where b=200,也有WHERE c=300,也有A=100 AND C=300
    总之各种情况都可能有。
    这样怎么样创建索引比较有效??在A,B,C都建单索引,还是建复合索引?有什么讲究么?
      

  4.   

    1、纠正,适用,MYSQL HELP
    concatenating the values of the given columns. Indexes can be created that use only the leading part of column values, using col_name(length) syntax to specify an index prefix length: ·         Prefixes can be specified for CHAR, VARCHAR, BINARY, and VARBINARY columns. ·         BLOB and TEXT columns also can be indexed, but a prefix length must be given. ·         Prefix lengths are given in characters for non-binary string types and in bytes for binary string types. That is, index entries consist of the first length characters of each column value for CHAR, VARCHAR, and TEXT columns, and the first length bytes of each column value for BINARY, VARBINARY, and BLOB columns.
      

  5.   

    要分析具体的数据分布条件,否则很难直接回答。最简单的方法是为每种组合都创建一个索引
    create index xx on table1(a)
    create index xx on table1(b)
    create index xx on table1(c)
    create index xx on table1(a,b)
    create index xx on table1(a,c)
    create index xx on table1(b,c)
    create index xx on table1(a,b,c)但实际中可以根据左适应原则 create index xx on table1(a)
    create index xx on table1(b)
    create index xx on table1(c)
    create index xx on table1(a,b)
    create index xx on table1(a,c)
    create index xx on table1(b,c)
    create index xx on table1(a,b,c)
    但这样并不是最完善的,需要根据A,B,C中的数据分布进行优化索引。比如到底是 (a,b,c) 还是 (b,a,c) 细节上还是有不少讲究的。
      

  6.   

    6楼说的数据分布情况进行索引优化,是不是说哪种,哪几种的条件查询次数最多,就给他们创建索引??
    比如WHERE A=100 AND B=100这样的有200次
    WHERE B=200 AND C=100  100次
    WHERE A=100  400次这样的话,索引就定为(A,B),这样满足了600次,只有100次不满足。我理解是否正确?
      

  7.   

    数据分布:比如你一共600条记录,其中A字段全都是1, 那么这个索引可以说毫无意义。如果A的值有两种0或1,则这个索引的效率可以说也是很差,但如果B上的值有30种不同的值,则这个索引就比较有意义了。如果C上有600个不同的值(主键),则这个索引本身是高效 的。 但同样如果B中有1,2,3.30种不同的值,但记录不是平均分布。其中1-29各有一条,而其余的571条记录的值都是30,那这个索引就要考虑了。另外你提到的查询次数,也需要考虑,如果从来都不会有查询在C上做条件,则显然C上的索引没有任何意义。
      

  8.   

    关于索引 的优化 估计需要几千个字和一大堆例子,建议楼主查阅相关书籍。毕竟你不能指望我在这儿打上几千字。以上讲述的内容在下面这本书都者有。《数据库系统概论(第四版)》 王珊 萨师煊   高等教育出版社 (掌握基础知识和概念) MYSQL的官方手册。(方便以后查找,避免类似于考试的时候,给你本政治书也不知道答案在第几章,第几页)MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html