请教Mysql全文索引的问题

请教Mysql全文索引的问题,第1张

Mysql全文索引的问题
全文索引是为LIKE子句设计的。使用得当时可以极大提升效率。但是,mysql的全文索引是有局限的。
1
2
select id from `data_table` where `content` like '%百度%';
select id from `data_table` where `content` like '百度%';
第一个SQL语句是不能使用全文索引的。要使用全文索引,搜索的字符串的前端必须是“固定的”,即不能是通配符。
建议在查询前使用查询计划
1
explain select id from `data_table` where `content` like '百度%';
执行后会输出一条记录,其中“key”一列为你使用的索引。看看这个SQL是否用到索引。

先正面回答你的问题
数据是否重复不是建立索引的重要依据,甚至都不是依据。
只要不完全重复(所有元组的该元素都一样),那么建立索引就是有意义的。
即使当前数据完全重复,也不是不能建立索引,这种情况有点复杂,不细说了。
对于你后面的疑问,可以给你一个如何建立索引的忠告,“如何查就如何建”。
索引的建立,唯一的原因就是为了查询(广义的查询),实际上建立索引会使得数据存储所占空间变大,有时索引所占的空间会查过数据本身的空间。索引的建立也会使得数据插入时变慢,特殊情况下,慢的难以忍受,所以dba的重要工作之一,就是检查索引层级并优化。
索引建立的唯一好处,就是按照索引查询时,变快了。type,status这2个字段是否适合建立索引,就要看你是否要按照这2个字段进行检索。而检索的顺序决定了如何建立索引。
对于索引类型和索引方式,我建议就
normal

btree
就适用于大多数情况。若你参与的是一个大数据处理项目,对数据存储和检索有特别要求,那么需要分析多个层面,比如数据吞吐量、数据的方差、平均差等等很多参数才考虑是否用聚集索引等(mysql好像还没聚集索引),至于是否是唯一索引,我建议不使用,即使能判定数据是唯一的也不要用,全文索引也没有必要。

一个简单的表
我们将在整个过程中使用下面的表
CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;
如果你没有把默认的表类型设置成MyISAM以外的类型那么TYPE=MyISAM可以省略建表之后,向其中填充一些数据,例如:
INSERT INTO fulltext_sample VALUES
('It appears good from here'),
('The here and the past'),
('Why are we hear'),
('An all-out alert'),
('All you need is love'),
('A good alert');
如果你已经建立好了一个表,你可以使用ALTER TABLE(就像CREATE INDEX语句一样)语句添加一个全文索引,例如:
ALTER TABLE fulltext_sample ADD FULLTEXT(copy)
查找文本
全文索引搜索的语法很简单,你只要MATCH字段,AGAINST你要查找的文本,例如:
mysql> SELECT FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');

建立全文索引需要注意,默认索引词最小单位是4,一般都需要稍微修改一下,show variables like 'ft_min_word_len'; 查看默认
linux 修改/etc/mycnf中配置,将ft_min_word_len=1加到mysqld下保存,并重启服务器。
表上建立全文索引,多个字段逗号隔开,全文索引查询时也要多个字段
alter table xxx add fulltext(nickname);


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13062777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存