【发布时间】: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