2013-03-04 48 views
0

我有一个customer_id,customer_name,email,password,status等字段的客户表。哪个索引更适合简单检查

目前只有CUSTOMER_ID被索引(因为它是主键)

我有一个客户选择如下几个疑问

select * from customer 
where status=1 and email<>'' 
and email is not null 
and password<>'' 
and password is not null 

这将运行缓慢,因为我在这 有130万条记录,以便我正在考虑在电子邮件字段中添加索引。 我想知道哪些索引会使它更好,简单的索引将起作用,或者我必须使用FULLTEXT索引

+1

呃......我很抱歉,但你为什么不试试呢?首先,目前尚不知道您的数据库中有多少无电子邮件和无密码记录。 – raina77ow 2013-03-04 13:14:54

+2

我想象一个FULLTEXT索引将会是一种浪费 - 你不是在查询中搜索字段。但当然我不知道你的查询是否都不在这个领域搜索。 – Dukeling 2013-03-04 13:18:44

+2

您的130万行中有多少行返回?如果它返回大部分,索引可能根本没有帮助你。 – nos 2013-03-04 13:48:27

回答

1

A FULLTEXT索引有助于在列中搜索单词。

如果你真的只是搜索(和非空)的电子邮件和密码,那么一个简单的索引就足够了。

对于这种非常查询更相关的索引将是:

ALTER TABLE customer ADD INDEX (status, email, password); 

[编辑]

作为正确地Dukeling 等人指出。,如果您的customers中的大多数确实设置了电子邮件或密码,则此索引可能无效。

假设上述(您的大多数客户确实有电子邮件和密码设置),那么您的查询会返回很多记录,并且任何索引都没有什么帮助(正如nos和raina77ow所建议的那样)。

唯一可以确定的是,FULLTEXT索引在这种情况下是无用的。

+3

'最好'是相对的。一般在提出索引时,尤其是在黑盒数据集上,应该提及[cardinality](http://en.wikipedia.org/wiki/Cardinality_(SQL_statements))。 – Dukeling 2013-03-04 13:54:41

+0

@Dukeling我想我昨天错过了你的观点。现在我明白你指的是匹配每个条件的记录的相对数量(与表中记录的总数相比)。我很抱歉,我为这个答案取得了任何荣誉。 – RandomSeed 2013-03-05 08:53:05