mysql - 全文索引和搜索速度

标签 mysql performance full-text-search query-optimization full-text-indexing

关于 PHP/MySql 网站上的数据库/速度问题的问题。全文搜索的查询似乎很慢。

我不是 SQL 专家,只是针对基本网站的简单基本 php/html 编程和一些基本的 MySQL 知识。客户对由外部程序员开发的站点上的搜索选项存在速度问题,该选项不再可用。我们发现了以下信息:

  • MySQL 数据库,表中包含大约 225000 行 (myISAM)。

  • 具有全文索引的列 (DATA) 包含需要搜索的数据。

  • 此列平均每行包含 200 个单词。

  • 在 phpmyadmin 中(我们只有 phpmyadmin 访问和 ftp 没有直接服务器访问)我们看到全文索引的基数是 1。

  • 有一个特定的查询似乎非常慢,当我们在 phpmyadmin 中为该查询执行 EXPLAIN 时,它返回:

    id select_type table type possible_keys key key_len ref rows Extra 1
    SIMPLE T_SEARCHDATA fulltext DATA DATA 0 1 Using where; Using
    filesort 1 SIMPLE TU_CUS const PRIMARY PRIMARY 4 const 1 Using
    index 1 SIMPLE M_CATEGORY eq_ref PRIMARY PRIMARY 4
    buitenbeeld.T_SEARCHDATA.PC_ID 1 Using index
    

执行查询时,在执行查询前需要等待一段时间,使用以下查询:

    SELECT T_SEARCHDATA.MID,T_SEARCHDATA.MT_IMG,T_SEARCHDATA.MP_IMG,T_SEARCHDATA.M_ACTIVE,T_SEARCHDATA.TITLE
    FROM T_SEARCHDATA LEFT JOIN TU_CUS ON TU_CUS.UB_ID = 0 LEFT
    JOIN M_CATEGORY ON M_CATEGORY.PC_ID = T_SEARCHDATA.PC_ID
    WHERE MATCH (T_SEARCHDATA.DATA) AGAINST ('+searchword1* +searchword2* +searchword3*' IN BOOLEAN MODE) AND M_ACTIVE = 1 ORDER BY T_SEARCHDATA.UPDATE DESC
    LIMIT 0,30 

我们的问题

根据确切的搜索词,上面的查询需要 5 到 30 秒才能执行。第一次我们执行查询后,第二次非常快,某种缓存似乎被激活了???

我的一些更具体的问题:

  1. 全文索引的基数为 1 可以吗?成立 关于这个问题的一些答案,但没有明确的答案为什么会这样 一个完整的索引就可以了。

  2. 关于速度,一个 225000 行的数据库( future 几周可能会增长到 300000 行)需要这么多时间来执行此查询,这难道不奇怪吗?查询有问题吗,能否优化一下?

  3. 在这种情况下,全文搜索是最佳选择吗?

最佳答案

  1. 全文索引的基数似乎总是报告为 1。无论如何,基数与全文索引并不真正相关,因此值 1 可能只是一个占位符。

  2. 确保您有足够的 key_buffer_size 来保存全文索引。如果它必须在每次查询期间不断将部分索引交换进出键缓冲区,那将降低性能。

  3. Sphinx Searchusually faster比 MySQL 的全文索引。

关于mysql - 全文索引和搜索速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21564103/

相关文章:

c - 分配过多内存的性能损失(?)

python - 具有可变数量因子的 Numpy 向量化求和

PHP/MySQL : Simple search engine

php - 将引号添加到以逗号分隔的字符串中的值 php

php - mysql 转义 getsqlvaluestring AccID

php更新数据库中的多个选择选项值

mysql - 如何限制UNION ALL查询的结果?

java - Java 和 Python 中对 HBase 的并行扫描请求具有不同的性能

mysql - 错误 : Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS )

mysql - 为什么Mysql匹配 bool 模式找不到 "Knows"