MySQL数据库是目前广泛应用的关系数据库管理系统,它支持多种搜索引擎,包括MyISAM、InnoDB、MEMORY等等。在实现高效、快速的数据检索过程中,搜索引擎的优化技巧和应用技术至关重要。本文将深入探究mysql数据库搜索引擎的优化技巧和应用技术,为读者提供实用的操作指南和技术支持。
一、MyISAM搜索引擎优化技巧
MyISAM搜索引擎是MySQL应用最为广泛的搜索引擎之一,它具有快速高效、容易理解、易于使用的特点。然而,在大量数据的处理过程中,MyISAM搜索引擎的性能存在不足,需要进行优化。以下是MyISAM搜索引擎的优化技巧:
1. 字段类型选择
在使用MyISAM搜索引擎时,选择适当的字段类型对性能的提升至关重要。不同的字段类型会对数据存储方式、索引结构等产生影响。例如,CHAR类型比VARCHAR类型占用的空间更大,但查找速度更快。同时,使用固定长度的字符串类型比变长的字符串类型对索引的效率更高。因此,在设计数据库表结构时应谨慎选择字段类型,优先考虑性能因素。
2. 索引优化
索引是优化MyISAM搜索引擎性能的关键之一。索引可以提高数据检索速度、优化查询计划,从而减少系统资源的占用。在使用MyISAM搜索引擎时,应合理设计并使用索引。合理的索引设计能够大大减少数据读取的IO次数,提升查询效率。同时,在索引的设计、建立和维护过程中,需要注意以下几点:
(1)索引字段应选择常用的字段或者频繁参与where、order by、group by等操作的字段。
(2)索引长度应该尽可能的短,这样能够减少占用磁盘的空间和IO量。
(3)索引应建立在数据量较小的字段上,可减少索引递归的层数,提升查询索引的效率。
3. 数据存储优化
在使用MyISAM搜索引擎时,数据存储的优化也是提升性能的重要一环。以下是进行数据存储优化的几点建议:
(1)减少字段数量:尽量减少不必要的字段。
(2)减少NULL字段的数量: NULL字段越少,数据的存储空间就越小,系统的查询效率就越高。
(3)优化表单中的大字段:将表单中的大字段拆分为物理表,通过引用该表的方式查询,从而提升查询效率。
二、InnoDB搜索引擎的应用技术
InnoDB搜索引擎是MySQL数据库管理系统中比较优秀的一个搜索引擎,该搜索引擎在处理事务和高并发性方面效果显著。下面介绍一些关于InnoDB搜索引擎的应用技术:
1. 事务优化
InnoDB搜索引擎具有事务性特征,因此,在使用InnoDB搜索引擎时,事务优化是必不可少的一环。以下是一些优化InnoDB搜索引擎的有用技巧:
(1)使用长事务:如果一项操作需要占用许多资源或涉及多个数据的修改,则应考虑使用长事务来完成这项操作。
(2)避免使用LOAD DATA:避免使用LOAD DATA来导入大量数据。在数据量很大时,单次的操作可能会占用大量的系统资源,造成系统的阻塞。
2. 性能监控
InnoDB搜索引擎的性能监控对优化搜索引擎非常有帮助。通过性能监控,可以了解InnoDB搜索引擎的性能表现和系统的负载情况,同时也可以及时诊断系统的问题,提高系统的稳定性和可用性。以下是几个性能监控的重点:
(1)InnoDB Data Locking:该指标用于监控是否发生了锁等待事件。在InnoDB搜索引擎中,为了保证数据的一致性,事务执行的同时需要获得锁。过多的锁等待事件将影响查询性能。
(2)InnoDB Data Reads:该指标用于监控InnoDB搜索引擎中的数据读取次数。
(3)InnoDB Buffer Pool:该指标用于监控内存缓存池的使用情况。通过该指标可以了解到缓存池的空间使用情况和淘汰机制等。
三、MEMORY搜索引擎的应用技术
MEMORY搜索引擎是MySQL搜索引擎中的一种,它将数据存放在内存中,可用于缓存一些数据和临时表的创建。以下是一些关于MEMORY搜索引擎的应用技术:
1. 合理设计缓存数据
MEMORY搜索引擎是采用内存存储数据的,因此,在实际应用中应合理设计缓存数据的大小,避免过多占用内存。以下是一些关于合理设计缓存数据的建议:
(1)尽量避免存储大字段,包括BLOB、TEXT等类型。
(2)避免使用比较长的字符串字段,尽量使用较短的字符串字段。
(3)在只读数据上应优先使用MEMORY搜索引擎,数据可被快速加载,并可极大的提高查询速度。
2. 优化内存使用
MEMORY搜索引擎在处理内存使用上非常敏感,因此,在应用过程中应注意内存使用的优化。以下是一些技巧:
(1)尽量不要使用临时表,以避免占用大量内存。
(2)不要使用LOCK TABLES等语句,因为它会占用资源,同时,也可能导致死锁。
(3)考虑使用INSERT DELAYED语句,尽量在执行INSERT语句时,减少占用内存的情况。
四、
MySQL搜索引擎的性能在各种应用场景中起着至关重要的作用。本文介绍了MyISAM、InnoDB、MEMORY搜索引擎的优化技巧和应用技术,供读者参考。在实际应用过程中,需要针对实际情况进行优化,不断进行性能测试和性能监控,不断找寻提升系统性能的优化技巧和应用技术。只有保持系统的高可用性和高性能,我们才能更有效地应对不断变化的应用需求。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX)。
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多乎凳种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。在这里,我们就不追根究底其底层实现原理了,现在我们来看看在MySQL中如何创建并使用全文索引。
在MySQL中,创建全文索引相对比较简单。例如,我们有一个文章表(article),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句如下:
–创建article表
CREATE TABLE article (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content) –在title和content列上创建全文索引
);
上面就是在创建表的同时建立全文索引的SQL示例。此外,如果我们想要给已经存在的表的指定字段创建全文索引,同样以article表为例,我们可以使用如下SQL语句进行创建:
–给现有的article表的title和content字段创建全文索引
–索引名称为fulltext_article
ALTER TABLE article
ADD FULLTEXT INDEX fulltext_article (title, content)
在MySQL中创建全文索引之后,现在就该了解如何使用了。众所周知,在数据库中进行模糊查询是使用LIKE关键字进行查询,例如:
SELECT * FROM article WHERE content LIKE ‘%查询字符串%’
那么,我们使用全文索引也是这样用的吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询。例如橡顷逗,我们想要在article表的title和content列中全文检索指定的查询字符串,可以如下编写SQL语句:
SELECT * FROM article WHERE MATCH(title, content) AGAINST(‘查询字符串’)
强烈注意:MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySQL自带的全文索引只能对英文进行全文检索梁卖,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。本站将会在后续文章中对Sphinx以及Coreseek进行介绍。
备注1:目前,使用MySQL自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySQL全文索引所能找到的词的默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。
备注2:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。
全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文。缘由是他从来都使用空模慎格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词。这不悄码态,从MySQL5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。
在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,比如,
ngram_token_size=2
这里把分词大小设置为2。要记住,分词的SIZE越大,索引的体积就越大,所以要根据自身情况来设置合适的大小。
示例表结构:
CREATE TABLE articles (
id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
titleVARCHAR(200),
body TEXT,
FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDBCHARACTER SET utf8mb4;
示例数据启源,有6行记录。
mysql> select * from articles\G
***************************1. row ***************************
id: 1
title: 数据库管理
body: 在本教程中我将向你展示如何管理数据库
***************************2. row ***************************
id: 2
title: 数据库应用开发
body: 学习开发数据库应用程序
***************************3. row ***************************
id: 3
title: MySQL完全手册
body: 学习MySQL的一切
***************************4. row ***************************
id: 4
title: 数据库与事务处理
body: 系统的学习数据库的事务概论
***************************5. row ***************************
id: 5
title: NoSQL精髓
body: 学习了解各种非结构化数据库
***************************6. row ***************************
id: 6
title: SQL 语言详解
body: 详细了解如果使用各种SQL
6 rows inset (0.00 sec)
显式指定全文检索表源
mysql> SETGLOBAL innodb_ft_aux_table=”new_feature/articles”;
Query OK, 0 rows affected (0.00 sec)
通过系统表,就可以查看到底是怎么划分articles里的数据。
mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10;
+——++++++
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID| POSITION |
+——++++++
| 中我 ||||||
| 习m ||||||
| 习了 ||||||
| 习开 ||||||
| 习数 ||||||
| 了解 ||||||
| 了解 ||||||
| 事务 ||||||
| 事务 ||||||
| 何管 ||||||
+——++++++
10 rows in set (0.00 sec)
这里可以看到,把分词长度设置为2,所有的数据都只有两个一组。上面数据还包含了行的位置,ID等等信息。
接下来,我来进行一系列检索示范,使用方法和原来英文检索一致。
1. 自然语言模式下检索:
A,得到符合条件的个数,
mysql>SELECT COUNT(*) FROM articles
> WHERE MATCH (title,body) AGAINST (‘数据库’ IN NATURALLANGUAGE MODE);
++
| COUNT(*) |
++
||
++
row in set (0.05 sec)
B,得到匹配的比率,
mysql>SELECT id, MATCH (title,body) AGAINST (‘数据库’ IN NATURAL LANGUAGE MODE)
AS score FROM articles;
+—-++
| id| score |
+—-++
| 1 | 0.825 |
| 2 | 0.825 |
| 3 ||
| 4 | 0.825 |
| 5 | 0.4124 |
| 6 ||
+—-++
6rows in set (0.00 sec)
2. 布尔模式下搜索,这个就相对于自然模式搜索来的复杂些:
A,匹配既有管理又有数据库的记录,
mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST (‘+数据库 +管理’ IN BOOLEAN MODE);
+—-+++
| id| title | body |
+—-+++
| 1 | 数据库管理| 在本教程中我将向你展示如何管理数据库
|
+—-+++
1 rowin set (0.00 sec)
B,匹配有数据库,但是没有管理的记录,
mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST (‘+数据库 -管理’ IN BOOLEAN MODE);
+—-+—-++
| id| title| body|
+—-+—-++
| 2 | 数据库应用开发| 学习开发数据库应用程序 |
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论|
| 5 | NoSQL 精髓| 学习了解各种非结构化数据库 |
+—-+—-++
3rows in set (0.00 sec)
C,匹配MySQL,但是把数据库的相关性降低,
mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST (‘>数据库 +MySQL’ INBOOLEAN MODE);
+—-+-+—+
| id| title| body|
+—-+-+—+
| 3 | MySQL完全手册|学习MySQL的一切|
+—-+-+—+
1 rowin set (0.00 sec)
3,查询扩展模式,比如要搜索数据库,那么MySQL,oracle,DB2也都将会被搜索到,
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body)
-> AGAINST (‘数据库’ WITH QUERY EXPANSION);
+—-+—-++
| id| title| body |
+—-+—-++
| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论
| 2 | 数据库应用开发| 学习开发数据库应用程序|
| 5 | NoSQL 精髓| 学习了解各种非结构化数据库 |
| 6 | SQL 语言详解| 详细了解如果使用各种SQL|
| 3 | MySQL完全手册| 学习MySQL的一切|
+—-+—-++
6rows in set (0.01 sec)
算了。估计这次回答没分。
跟你聊聊所谓的智能搜索吧。
不用 like 实现你说的智能一些的搜索。首先你得做一套分词银慧系统。就是把你那一句话分成若干个词。
比如“你是个非常牛逼的二傻子”这句话。你不能把“你是个”当成一个词吧。 智能一点的分词应该是把“你、非常、牛逼、傻子”分出来。
然后就开始涉伏搏明及到一个权重问题了。就是 你分出来的这些词 到底你希望哪些符合条件的缺告结果排在签名。很明显上面那句话 傻子的权重要高一些。其次是牛逼。
然后 根据权重结果匹配呈现出结果来。
基本上 搜索引擎都是这么干的。 分词—数据查询—-权重排序—-结果呈现。
数据量大不要使用mysql来做模糊搜索,可以借助其它工具像Lucene之类。
1.避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的隐绝操作符。
2.优化SQL语句(让SQL语句更合理一些)。
3.优化数据库字段类型。(能用其他凳旦的尽量不要用VCHAR)
4.建立储存过程枣携扰。
模糊搜索本来就棚局慢,like如果是”%?%”形式时根本就无法用到主键索引,因此必然慢,但是like “链顷让乎兄?%” 就可以用到索引
你可以把已查询的数据放在单独的IP上不就可以了么
关于mysql数据库搜索引擎的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
香港服务器选创新互联,香港虚拟主机被称为香港虚拟空间/香港网站空间,或者简称香港主机/香港空间。香港虚拟主机特点是免备案空间开通就用, 创新互联香港主机精选cn2+bgp线路访问快、稳定!
当前名称:深入探究MySQL数据库搜索引擎:优化技巧与应用技术(mysql数据库搜索引擎)
本文来源:http://www.mswzjz.cn/qtweb/news13/367613.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能