赞
踩
工作中遇到百万、千万级的数据在mysql中可以解决的方式有,索引和分库、分表,这篇文章介绍的是MySQL中的索引的操作。
普通索引(Normal index)是我们常见的索引形式:可以创建在单列或者多列上:
CREATE INDEX index_name ON your_table (column_name);
index:创建索引的关键字
index_name:索引名字(最好望名生义)
your_table:表名
colunm_name:字段名(要创建上哪个字段上)
CREATE INDEX index_name ON your_table (column1, column2);
index:创建索引的关键字
index_name:索引名字(最好望名生义)
your_table:表名
colunm1,colunm2:字段名(复合索引是多个列的独立索引,建立在两个或两个以上的索引)
CREATE INDEX index_name ON your_table (column_name(10));
有时候创建索引时候会报错Specified key was too long; max key length is XXXX bytes 意思为:超过索引的最大长度限制,解决方式其实就是前缀索引,给索引设置一个击中长度。
sql语句
ALTER TABLE table_name ADD FULLTEXT(column_name);
注意:创建全文索引的时候,创建的最长字段默认是16个,超过16长度会报错
1、自然语言模型(NATURAL LANGUAGE MODE):
自然语言类型:简单来讲就是基于自然语言处理的全文检索模型。他会自动将查询语句分析和匹配。自然语言考虑了单词之间的关系,并且自动分析查询意图(会进行语句拆分)从而达到快速匹配全文内容
2、布尔模型(BOOLEAN MODE):
布尔模型:布尔模型是一种基于布尔逻辑的全文检索模型。他可以使用布尔运算来组合查询条件,运算符包含(AND、OR、NOT、*(转义符));
AND(+):返回同时包含所有查询关键词的数据
OR:返回任意关键词的数据
NOT(-):排除包含指定关键词的文档
布尔类型和自然语言类型的区别在于:布尔类型更容易拓展一些运算,但是自然语言更容易分析使用者的意图
实例:
SELECT * FROM your_table
WHERE MATCH(column_name1, column_name2, column_name3, column_name4) AGAINST('1*' IN BOOLEAN MODE)
此查询为:使用布尔模型,在全文中检索以1开头的所有数据(只要这几个字段中开头包含1就会击中返回);
SELECT * FROM your_table
WHERE MATCH(column_name1, column_name2, column_name3, column_name4) AGAINST('+1* +o*' IN BOOLEAN MODE)
此sql意思跟上面sql大致一样,相同的是,在全文中检索以1开头的所有数据,不同是的,使用了+,这个符号的意思是同时包含1和字母o的数据
SELECT * FROM your_table
WHERE MATCH(column_name1, column_name2, column_name3, column_name4) AGAINST('+1* -o*' IN BOOLEAN MODE)
此sql跟上面的意思大致一样,前面都是一样的,后的 -o 意思是返回没有o开头的数据;
需要注意的是:全文检索中,没有左模糊,只有右模糊(*);
- 默认情况下,只能搜索至少 4 个字符的关键词。可以通过修改 ft_min_word_len 参数来调整最小关键词长度。
- 默认情况下,只会返回包含至少一个关键词的行。可以使用 IN BOOLEAN MODE 来进行布尔全文搜索,以更灵活地控制搜索结果。
谢言:
其实不管是使用索引还是不使用索引,我们遇到大数据量查询,操作的时候第一时间就应该先考虑到用户体验,以及查询效率、服务器承载量。使用最适合我们的才是最好的,在全文检索中,要是使用了模糊,其实会大大提高查询效率的,但是要是遇到没办法的需求,那我们就不得不选择硬上,为了提高用户体验,我们可以在代码或者表上再继续做处理;
百万级数据,模糊查询没有做别的任何操作查询时间21s其实也就这个上下,但是才百万级就耗费了21秒,肯定会影响用户体验。优化的事就在后面写吧;
最后接受所有人的批评和建议,欢迎来较量;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。