我用同样的问题检查了其他问题,但是它们似乎没有主键或者要检查的行数很低,这让MySQL决定不使用索引。在我的情况是不同的,加入“档案”表增加了10秒的查询执行。这是解释结果:
| 身份证|选择类型|table|类型|可能键|键|键透镜|参考|行|额外的|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 1|简单|斯塔图茨|常数|初级|初级|四|常数|1|使用索引;使用临时;使用文件排序|
| 1|简单|档案|全部|初级|零|零|零|九二八○一|用在哪里|
| 1|简单|dt|参考|PRIMARY、dossierId、statutId|档案ID|四|btecma5_jaddad.dossiers.dossierId|1|使用指标条件;用在哪里|
| 1|简单|dtst|参考|dossierTribunalId、statutProcedureId、utilisateurId|档案TribunalId|四|btecma5_jaddad.dt.dossierTribunalId|四|使用指标条件;用在哪里|
| 1|简单|SP|eq_ref|初级|初级|四|btecma5_jaddad.dtst.statutProcedureId|1|用在哪里|
| 1|简单|利用者|eq_ref|初级|初级|四|btecma5_jaddad.dtst.utilisateurId|1|用在哪里|
| 1|简单|DTT|参考|档案TribunalId|档案TribunalId|四|btecma5_jaddad.dt.dossierTribunalId|六|用在哪里|
| 1|简单|dttl|eq_ref|初级|初级|四|btecma5_jaddad.dtt.dossierTribunalTransfertLotId|1|用在哪里|
下面是查询:(档案。estSoumis没有索引,但它没有太大的区别)
SELECT
dt.utilisateurId dossierPhysiqueUtilisateurId,
COUNT(dttl.dossierTribunalTransfertLotId) totalTransferts,
traceDate dateSoumission,
dtst.utilisateurId creationUtilisateurId,
CONCAT(utilisateurs.prenom,' ',utilisateurs.nom) nomAgent
FROM dossiers_tribunaux_statuts_traces dtst
JOIN dossiers_tribunaux dt USING(dossierTribunalId)
LEFT JOIN dossiers_tribunaux_transferts dtt
ON(dt.dossierTribunalId = dtt.dossierTribunalId)
LEFT JOIN dossiers_tribunaux_transferts_lots dttl
ON(dttl.dossierTribunalTransfertLotId = dtt.dossierTribunalTransfertLotId
AND dttl.statut = 1)
JOIN dossiers dossiers USING(dossierId)
JOIN utilisateurs utilisateurs
ON(utilisateurs.utilisateurId = dtst.utilisateurId)
JOIN statuts_procedures sp USING(statutProcedureId)
JOIN statuts statuts ON(statuts.statutId = sp.statutId)
WHERE statuts.statutId = 1
AND dt.statutId != 211
AND dossiers.estSoumis = 1
AND dtst.utilisateurId IN(3, 4, 5, 6, 7, 8, 9, 10, 62, 63)
GROUP BY dt.dossierTribunalId;
编辑:添加了表格结构和索引:
--
-- Table structure for table `dossiers`
--
CREATE TABLE `dossiers` (
`dossierId` int(10) UNSIGNED NOT NULL,
`numeroDossier` int(6) NOT NULL,
`typeDossier` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1:masse;2:grand',
`clientId` int(11) DEFAULT NULL,
`dateCreation` datetime NOT NULL,
`creationUtilisateurId` int(11) NOT NULL,
`estSoumis` tinyint(1) NOT NULL DEFAULT 0,
`dateSoumission` datetime DEFAULT NULL,
`anneeDossier` int(4) NOT NULL,
`estArreter` tinyint(1) NOT NULL DEFAULT 0 COMMENT '1:provisoire,2:definitif',
`arretDate` datetime DEFAULT NULL,
`arretUtilisateurId` int(11) DEFAULT NULL,
`arretAnnulationDate` datetime DEFAULT NULL,
`arretAnnulationUtilisateurId` int(11) DEFAULT NULL,
`piecesClientsScan` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:pas encore;1:scannés',
`piecesClientsScanDate` datetime DEFAULT NULL,
`lotFacturationId` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `dossiers_tribunaux`
--
CREATE TABLE `dossiers_tribunaux` (
`dossierTribunalId` int(10) UNSIGNED NOT NULL,
`dossierTribunalParentId` int(11) DEFAULT NULL,
`numeroTribunalSequence` int(6) DEFAULT NULL,
`numeroTribunalCodeProcedure` int(4) NOT NULL,
`numeroTribunalAnnee` int(4) NOT NULL,
`procedureId` int(11) NOT NULL,
`dossierId` int(10) NOT NULL,
`statutId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `dossiers_tribunaux_statuts_traces`
--
CREATE TABLE `dossiers_tribunaux_statuts_traces` (
`dossierTribunalStatutTraceId` int(10) UNSIGNED NOT NULL,
`dossierTribunalId` int(11) NOT NULL,
`statutProcedureId` int(11) NOT NULL,
`traceDate` datetime NOT NULL,
`utilisateurId` int(11) NOT NULL,
`dossierActionId` int(11) DEFAULT NULL,
`besoinScan` tinyint(1) NOT NULL DEFAULT 0,
`estScanne` tinyint(1) NOT NULL DEFAULT 0,
`codeOperationScan` int(10) DEFAULT NULL,
`estExcluOperationScan` tinyint(1) NOT NULL DEFAULT 0,
`exclusionOperationScanUtilisateurId` int(11) NOT NULL,
`exclusionOperationScanDate` datetime DEFAULT NULL,
`extraCommentaire` text DEFAULT NULL,
`extraCommentaireDerniereMaj` datetime DEFAULT NULL,
`statutAffichable` tinyint(1) NOT NULL DEFAULT 1,
`crediteurId` int(11) DEFAULT NULL,
`crediteurDerniereMaj` datetime DEFAULT NULL,
`estIgnoreAudit` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `dossiers_tribunaux_transferts`
--
CREATE TABLE `dossiers_tribunaux_transferts` (
`dossierTribunalTransfertId` int(10) UNSIGNED NOT NULL,
`dossierTribunalTransfertLotId` int(11) NOT NULL,
`dossierTribunalId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `dossiers_tribunaux_transferts_lots`
--
CREATE TABLE `dossiers_tribunaux_transferts_lots` (
`dossierTribunalTransfertLotId` int(10) UNSIGNED NOT NULL,
`deUtilisateurId` int(11) NOT NULL,
`aUtilisateurId` int(11) NOT NULL,
`dateTransfert` datetime NOT NULL,
`statut` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0:en attente de validation;1: validé',
`dateValidation` datetime DEFAULT NULL,
`numeroLot` int(6) NOT NULL,
`anneeLot` int(4) NOT NULL,
`orderType` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1:lotId;2:numeroDossier',
`validationUtilisateurId` int(11) DEFAULT NULL COMMENT 'Pour diagnotiquer un probleme'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `statuts`
--
CREATE TABLE `statuts` (
`statutId` int(10) UNSIGNED NOT NULL,
`intituleStatut` varchar(100) NOT NULL,
`intituleStatutParent` varchar(100) NOT NULL,
`ordreAffichage` smallint(6) NOT NULL DEFAULT 1,
`intituleStatutArabe` varchar(100) NOT NULL,
`informationsComplementaires` text DEFAULT NULL,
`labelCouleur` varchar(50) NOT NULL DEFAULT 'info',
`typeStatut` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1:Action à faire;2: Réponse tribunal',
`estImportable` tinyint(1) NOT NULL DEFAULT 0,
`majStatutsId` text DEFAULT NULL,
`estRepetable` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `statuts_procedures`
--
CREATE TABLE `statuts_procedures` (
`statutProcedureId` int(10) UNSIGNED NOT NULL,
`statutId` int(11) DEFAULT NULL,
`procedureId` int(11) NOT NULL,
`intituleAction` varchar(255) DEFAULT NULL,
`nombreJoursRetard` int(2) DEFAULT NULL,
`nombreJoursRetardAlert` int(2) DEFAULT NULL,
`afficherTableauBord` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `utilisateurs`
--
CREATE TABLE `utilisateurs` (
`utilisateurId` int(10) UNSIGNED NOT NULL,
`nom` varchar(100) NOT NULL,
`prenom` varchar(100) NOT NULL,
`email` varchar(200) NOT NULL,
`motPasse` varchar(100) NOT NULL,
`usergroup` int(11) NOT NULL DEFAULT 1,
`peutLierFacture` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `dossiers`
--
ALTER TABLE `dossiers`
ADD PRIMARY KEY (`dossierId`),
ADD KEY `creationUtilisateurId` (`creationUtilisateurId`),
ADD KEY `arretUtilisateurId` (`arretUtilisateurId`),
ADD KEY `arretAnnulationUtilisateurId` (`arretAnnulationUtilisateurId`),
ADD KEY `clientId` (`clientId`),
ADD KEY `numeroDossier` (`numeroDossier`);
--
-- Indexes for table `dossiers_tribunaux`
--
ALTER TABLE `dossiers_tribunaux`
ADD PRIMARY KEY (`dossierTribunalId`),
ADD KEY `procedureId` (`procedureId`),
ADD KEY `dossierId` (`dossierId`),
ADD KEY `banqueId` (`banqueId`),
ADD KEY `employeurId` (`employeurId`),
ADD KEY `statutId` (`statutId`),
ADD KEY `suiviId` (`suiviId`),
ADD KEY `utilisateurId` (`utilisateurId`),
ADD KEY `lotFacturationId` (`lotFacturationId`);
ALTER TABLE `dossiers_tribunaux` ADD FULLTEXT KEY `contratsId` (`contratsId`);
ALTER TABLE `dossiers_tribunaux` ADD FULLTEXT KEY `adversairesId` (`adversairesId`);
--
-- Indexes for table `dossiers_tribunaux_statuts_traces`
--
ALTER TABLE `dossiers_tribunaux_statuts_traces`
ADD PRIMARY KEY (`dossierTribunalStatutTraceId`),
ADD KEY `dossierTribunalId` (`dossierTribunalId`),
ADD KEY `statutProcedureId` (`statutProcedureId`),
ADD KEY `dossierActionId` (`dossierActionId`),
ADD KEY `utilisateurId` (`utilisateurId`);
--
-- Indexes for table `dossiers_tribunaux_transferts`
--
ALTER TABLE `dossiers_tribunaux_transferts`
ADD PRIMARY KEY (`dossierTribunalTransfertId`),
ADD KEY `dossierTribunalTransfertLotId` (`dossierTribunalTransfertLotId`),
ADD KEY `dossierTribunalId` (`dossierTribunalId`);
--
-- Indexes for table `dossiers_tribunaux_transferts_lots`
--
ALTER TABLE `dossiers_tribunaux_transferts_lots`
ADD PRIMARY KEY (`dossierTribunalTransfertLotId`),
ADD KEY `deUtilisateurId` (`deUtilisateurId`),
ADD KEY `aUtilisateurId` (`aUtilisateurId`),
ADD KEY `validationUtilisateurId` (`validationUtilisateurId`),
ADD KEY `dossiers_transfert_idx_autilisateurid_dossiertribunal` (`aUtilisateurId`,`dossierTribunalTransfertLotId`);
--
-- Indexes for table `statuts`
--
ALTER TABLE `statuts`
ADD PRIMARY KEY (`statutId`);
--
-- Indexes for table `statuts_procedures`
--
ALTER TABLE `statuts_procedures`
ADD PRIMARY KEY (`statutProcedureId`);
--
-- Indexes for table `utilisateurs`
--
ALTER TABLE `utilisateurs`
ADD PRIMARY KEY (`utilisateurId`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `dossiers`
--
ALTER TABLE `dossiers`
MODIFY `dossierId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `dossiers_tribunaux`
--
ALTER TABLE `dossiers_tribunaux`
MODIFY `dossierTribunalId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `dossiers_tribunaux_statuts_traces`
--
ALTER TABLE `dossiers_tribunaux_statuts_traces`
MODIFY `dossierTribunalStatutTraceId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `dossiers_tribunaux_transferts`
--
ALTER TABLE `dossiers_tribunaux_transferts`
MODIFY `dossierTribunalTransfertId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `dossiers_tribunaux_transferts_lots`
--
ALTER TABLE `dossiers_tribunaux_transferts_lots`
MODIFY `dossierTribunalTransfertLotId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `statuts`
--
ALTER TABLE `statuts`
MODIFY `statutId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `statuts_procedures`
--
ALTER TABLE `statuts_procedures`
MODIFY `statutProcedureId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `utilisateurs`
--
ALTER TABLE `utilisateurs`
MODIFY `utilisateurId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;
2条答案
按热度按时间avwztpqn1#
PK * 可能 * 不被使用的原因有很多。但首先,让我们添加一些可能有助于提高性能的“复合”索引:
(Many这些也是“覆盖”,如“使用索引”所示。)
如果
estSoumis
的选择性不够好,我对dossiers
的推荐可能没有太大帮助。dossiers_tribunaux_transferts
的结构类似于多对多Map表。如果这是它的意图,那么删除代理id并以相反的顺序添加一个2列PK和一个2列INDEX
。看到 * 多对多 *a5g8bdjr2#
尝试添加这两个复合指数:
dossiers_tribunaux_transferts_lots(dossierTribunalTransfertLotId, statut)
might 帮助加快dossiers_tribunaux_transferts
和dossiers_tribunaux_transferts_lots
之间的LEFT JOIN,以及ON子句中的过滤条件dttl.statut = 1
。dossiers(dossierId, estSoumis)
* 可能 * 有助于加快dossiers_tribunaux
和dossiers
之间的JOIN,以及WHERE子句中的筛选条件dossiers.estSoumis = 1
。estSoumis
是tinyint,这个顺序可能会表现得更好。我有这个答案坐在编辑没有张贴和离开它过夜的错误,然后张贴,看到另一个答案。*