【问题标题】:MySQL searching long CHAR column, using smaller (substring) CHAR column as index?MySQL搜索长CHAR列,使用较小的(子字符串)CHAR列作为索引?
【发布时间】:2010-02-06 21:04:47
【问题描述】:

所以我有一个 UNIQUE CHAR(255) 列,我想找到一个特定的行,

创建 CHAR(10) INDEX 以提高搜索效率是否有意义? 我知道一个唯一的也是一个索引

引擎将通过索引扫描到第一个字母是 J,然后是 JO,然后是 JOH 但是 255 字节 x 100 万条记录的索引,是需要扫描的大量内存“空间”,而不仅仅是 10 字节 x 100 万条记录

mail_sub = LEFT(mail,10)
mail_sub = substr(mail,10)

`CREATE TABLE pwd(  
  id       INT,   
  mail_sub CHAR(10) NOT NULL,   
  mail     CHAR(255) NOT NULL,  
  pw_hash  CHAR(32) NOT NULL, 
 PRIMARY KEY (id),  
 UNIQUE KEY  ind_email (mail),  
 INDEX       rv_sub (mail_sub,id)  
) ENGINE = INNODB CHARACTER SET latin1;`

(id 不是 auto_increment,它是在插入之前定义的)

表格被读入了很多
SELECT * FROM pwd WHERE email='abcde12345.john@internet.com';
作为
SELECT * FROM pwd WHERE id=12345;

所以“id”或“mail”可能是主键,我看不出有什么区别;

我的问题是,类似

`SELECT * FROM pwd WHERE mail_sub='abcde12345' AND 
email='abcde12345.john@internet.com';`  

会让搜索更有效率吗?

优化器坚持使用“ind_email”
FORCE / IGNORE 索引没有用,根据文档 mysql 索引提示对于字符串类型会被默默忽略 (http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)

我想先用JOIN来搜索mail_sub,但没有成功

`EXPLAIN EXTENDED   
SELECT a.pw_hash FROM pwd as a   
JOIN pwd as b ON b.id=a.id  
WHERE a.mail_sub='abcde12345' AND b.mail='abc...john.com';`

您对此有何看法?

谢谢!

【问题讨论】:

    标签: mysql indexing performance


    【解决方案1】:

    添加一列,该列是电子邮件地址的散列。然后作为谓词使用where a.hash = hash('foo@bar.com') and a.email = 'foo@bar.com'

    事实上,mysql 包含一个散列函数,称为password(),它产生 16 字节散列。

    【讨论】:

    • 感谢您的建议 ----- 是的,我虽然使用 MD5(),它是 16 字节(32 十六进制),密码()实际上是 20 字节(40 十六进制字符)--- -- 但我可以在谓词中只使用哈希吗? --- 你写了and a.email = 'foo@bar.com' 所以我假设我们不能相信哈希是唯一的,尽管 mysql 会在插入期间确保唯一性,但我最终可能会告诉用户一个电子邮件地址已经注册,当它没有注册时,或者是我也太偏执了?
    • 当我之前尝试使用where a.hash = hash('foo@bar.com') and a.email = 'foo@bar.com' 时,mysql 一直使用email 索引----或者您是否建议使用哈希列不是唯一的,只是索引,因此“邮件=xxx" 过滤匹配索引的行?并且忘记通过 sql 约束强制邮件是唯一的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2013-10-14
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多