MySQL搜索长CHAR列,使用较小的(子串)CHAR列作为索引?

时间:2010-02-06 21:04:48

标签: mysql indexing performance

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

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

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

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索引是没用的,根据docs 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';`
你对此有何看法?

谢谢!

1 个答案:

答案 0 :(得分:0)

添加一个电子邮件地址的哈希列。然后用作谓词where a.hash = hash('foo@bar.com') and a.email = 'foo@bar.com'

碰巧,mysql包含一个名为password()的散列函数,它产生16个字节的哈希值。