我需要有关检索数据的查询的帮助。
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/