MySQL MyISAM为文本列编制索引

MySQL MyISAM为文本列编制索引,sql,mysql,Sql,Mysql,我的表上有一个执行缓慢的查询。它有一个where条款,例如: where supplier= 'Microsoft' 列类型为文本。在phpmyadmin中,我查看是否可以向表中添加索引,但该选项已禁用。这是否意味着您不能为文本列编制索引?这是否意味着像这样的每个更新查询都在执行完整表扫描 那么,最好的做法是将列分离到它自己的表中,在当前表中放置一个ID,然后在该表上放置一个索引吗?这可能会加快查询速度吗?您需要在索引中添加前缀长度。看看 以下内容在供应商字段的前50个字节上创建索引: mys

我的表上有一个执行缓慢的查询。它有一个where条款,例如:

where supplier= 'Microsoft'
列类型为文本。在phpmyadmin中,我查看是否可以向表中添加索引,但该选项已禁用。这是否意味着您不能为文本列编制索引?这是否意味着像这样的每个更新查询都在执行完整表扫描


那么,最好的做法是将列分离到它自己的表中,在当前表中放置一个ID,然后在该表上放置一个索引吗?这可能会加快查询速度吗?

您需要在索引中添加前缀长度。看看

以下内容在供应商字段的前50个字节上创建索引:

mysql> create index supplier_ix on t(supplier(50));
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

但也许你应该重新考虑供应商的数据类型?从名称来看,它听起来不像一个典型的文本字段…

您应该检查

select max(length(supplier)) from the_table;
如果长度小于255,则可以(并且应该)将其转换为varchar(255)并在其上构建索引

选择正确的数据类型更为重要


如果长度很长,在有限的长度上建立索引会有帮助。

我对你的理解正确吗?这是一个文本栏?与BLOB对应的类型相同?我可以建议您为本专栏考虑使用VARCHAR吗?

您仍然可以对VARCHAR专栏进行全文搜索吗?是的,您可以。问题是,您是否应该对假定包含供应商名称的列使用全文搜索。
where supplier='Microsoft'
条件无论如何都不使用全文索引。这将返回我14。在“常规”中,varchar列的性能会比文本列好吗(即使文本列已被索引?),通常会。您最多可以将VARCHAR用于65536个字符。。。。所有列中包含65536个字符。这意味着如果有两列,则每列的长度约为32765字节。(请注意,UTF使用3个字节)这会防止发生完整表扫描吗?如果我说是,您还会重新考虑数据类型的选择吗?:)您在SE上的使用情况非常特殊:投票率低,但浏览量巨大。干杯