mysql - 选择 order By 并限制 3,000,000 行表的慢速

标签 mysql sql database performance indexing

我需要有关检索数据的查询的帮助。

SELECT DISTINCT dataSet.professionalSid
FROM dataSet dataSet
INNER JOIN dataProfessional dataPro ON dataSet.sId=dataPro.dataSetSid
LEFT OUTER JOIN dataProfessional dataPro2  ON dataSet.sId=dataPro2.dataSetSid
AND (dataPro2.itemDefinitionId='PRO_NOM_EXERCICE'
     AND dataPro2.dataSetDefinitionId='DIRECTORY_PROFESSIONAL_RPPS')
WHERE dataSet.archive=0
  AND dataPro.dataSetDefinitionId='DIRECTORY_PROFESSIONAL_RPPS'
  AND (dataPro.itemDefinitionId IN ('PRO_PRENOM_EXERCICE'))
  AND MATCH(dataSet.searchIndex) AGAINST('+*p* ' IN BOOLEAN MODE)>=1
ORDER BY dataPro2.stringValue DESC LIMIT 10

dataProfessional 表包含大约 3.7m 行和 dataSet 大约 820,000 行,其他表仅为 table def,仅包含 5-10 行。

此查询返回大约 28k 行,但我将其限制为 10。

索引:

表格数据集

+---------+------------+-----------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+
|  Table  | Non_unique |          Key_name           | Seq_in_index |       Column_name        | Collation | Cardinality | Sub_part | Packed | Null | Index_type |
+---------+------------+-----------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+
| dataSet |          0 | PRIMARY                     |            1 | sId                      | A         |      846564 | NULL     | NULL   |      | BTREE      |
| dataSet |          0 | sId                         |            1 | sId                      | A         |      846564 | NULL     | NULL   |      | BTREE      |
| dataSet |          1 | FK_dataSetDefinitionDataSet |            1 | dataSetDefinitionId      | A         |          70 | NULL     | NULL   |      | BTREE      |
| dataSet |          1 | FK_dataSetDefinitionDataSet |            2 | dataSetDefinitionVersion | A         |          76 | NULL     | NULL   |      | BTREE      |
| dataSet |          1 | FK_dataSetPatient           |            1 | patientSid               | A         |        2263 | NULL     | NULL   | YES  | BTREE      |
| dataSet |          1 | FK_dataSetProfessional      |            1 | professionalSid          | A         |      846564 | NULL     | NULL   | YES  | BTREE      |
| dataSet |          1 | FK_overrideDataSet          |            1 | overrideDataSetSid       | A         |           2 | NULL     | NULL   | YES  | BTREE      |
| dataSet |          1 | FullText                    |            1 | searchIndex              | NULL      |      846564 | NULL     | NULL   | YES  | FULLTEXT   |
+---------+------------+-----------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+

表格数据专业

+------------------+------------+-------------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+
|      Table       | Non_unique |           Key_name            | Seq_in_index |       Column_name        | Collation | Cardinality | Sub_part | Packed | Null | Index_type |
+------------------+------------+-------------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+
| dataProfessional |          0 | PRIMARY                       |            1 | sId                      | A         |     3636911 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          0 | sId                           |            1 | sId                      | A         |     3636911 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | FK_dataSetDataPro             |            1 | dataSetSid               | A         |     1818455 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | FK_itemDefinitionDataPro      |            1 | itemDefinitionVersion    | A         |           2 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | FK_itemDefinitionDataPro      |            2 | itemDefinitionId         | A         |        8172 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | FK_dataProfessionalDataSetDef |            1 | dataSetDefinitionId      | A         |         952 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | FK_dataProfessionalDataSetDef |            2 | dataSetDefinitionVersion | A         |         952 | NULL     | NULL   |      | BTREE      |
| dataProfessional |          1 | stringValue                   |            1 | stringValue              | A         |      909227 | 10       | NULL   | YES  | BTREE      |
+------------------+------------+-------------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+

这是查询的解释:

+-----+-------------+----------+----------+---------------------------------------------------+-------------------+---------+----------------------------+------+----------------------------------------------+
|  id | select_type |  table   |   type   |                   possible_keys                   |        key        | key_len |            ref             | rows |                    Extra                     |
+-----+-------------+----------+----------+---------------------------------------------------+-------------------+---------+----------------------------+------+----------------------------------------------+
|   1 | SIMPLE      | dataSet  | fulltext | PRIMARY   sId   FullText                          | FullText          |       0 |                            |    1 | Using where; Using temporary; Using filesort |
|   1 | SIMPLE      | dataPro  | ref      | FK_dataSetDataPro   FK_dataProfessionalDataSetDef | FK_dataSetDataPro |       8 | cloud_dev_eret.dataSet.sId |    2 | Using where; Distinct                        |
|   1 | SIMPLE      | dataPro2 | ref      | FK_dataSetDataPro   FK_dataProfessionalDataSetDef | FK_dataSetDataPro |       8 | cloud_dev_eret.dataSet.sId |    2 | Using where; Distinct                        |
+-----+-------------+----------+----------+---------------------------------------------------+-------------------+---------+----------------------------+------+----------------------------------------------+

你知道我可以在哪里看吗? 如果您需要更多元素,请告诉我

谢谢

最佳答案

我认为 EXPLAIN 输出相当直截了本地告诉您所有您需要知道的信息。

我看到索引被用于JOINs,但用于连接。我没有看到任何帮助重要的条款,例如 dataPro2.itemDefinitionId='PRO_NOM_EXERCICE'。我还看到了“全文”搜索,这可能会造成严重后果。

我也没有看到索引被用于 “dataSetsid”以支持 ON dataSet.sId=dataPro2.dataSetSid

简而言之,EXPLAIN 输出可能说明了一切:您基本上是在进行强力搜索,候选行的数量可能确实非常庞大。 (例如,如果 sId/dataSetSid 字段不是唯一的,从而导致 [部分] 笛卡尔积情况。)

关于mysql - 选择 order By 并限制 3,000,000 行表的慢速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874033/

相关文章:

c# - 需要创建一个在目标列中插入数据的 SSIS 包

JavaScript - 了解它们是否是显示特定日期记录的代码

sql-server - MS SQL Server 2008 - 从 MySQL 迁移时出现困惑 re : "select XYZ from TABLE"

mysql - 更新除最新重复行之外的所有重复行

当列包含 utf-8 字符时 MySQL 查询返回错误数据

c# - Xamarin(android)数据库连接错误

mysql - Codeigniter 数组值分配给变量

sql - 为什么数据库在更新行时执行删除和插入操作?

c# - LINQ删除错误(C#)

sql-server - 将 3 列合并在一起以创建唯一数据库列的最佳方法?扳机?