MySQL不使用主键作为索引

7fhtutme  于 2023-04-28  发布在  Mysql
关注(0)|答案(2)|浏览(137)

我用同样的问题检查了其他问题,但是它们似乎没有主键或者要检查的行数很低,这让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;
avwztpqn

avwztpqn1#

PK * 可能 * 不被使用的原因有很多。但首先,让我们添加一些可能有助于提高性能的“复合”索引:

dt:  INDEX(statutId, dossierTribunalId,  utilisateurId, dossierId)
dtst:  INDEX(utilisateurId, dossierTribunalId,  statutProcedureId)
    and DROP  KEY `utilisateurId`
dtt:  INDEX(dossierTribunalId,  dossierTribunalTransfertLotId)
    and DROP  KEY `dossierTribunalId`
dossiers:  INDEX(estSoumis, dossierId)

(Many这些也是“覆盖”,如“使用索引”所示。)
如果estSoumis的选择性不够好,我对dossiers的推荐可能没有太大帮助。
dossiers_tribunaux_transferts的结构类似于多对多Map表。如果这是它的意图,那么删除代理id并以相反的顺序添加一个2列PK和一个2列INDEX。看到 * 多对多 *

a5g8bdjr

a5g8bdjr2#

尝试添加这两个复合指数:

CREATE INDEX idx_dossierTribunalTransfertLotId_statut ON dossiers_tribunaux_transferts_lots(dossierTribunalTransfertLotId, statut);
CREATE INDEX idx_dossierId_estSoumis ON dossiers(dossierId, estSoumis);

dossiers_tribunaux_transferts_lots(dossierTribunalTransfertLotId, statut)might 帮助加快dossiers_tribunaux_transfertsdossiers_tribunaux_transferts_lots之间的LEFT JOIN,以及ON子句中的过滤条件dttl.statut = 1
dossiers(dossierId, estSoumis) * 可能 * 有助于加快dossiers_tribunauxdossiers之间的JOIN,以及WHERE子句中的筛选条件dossiers.estSoumis = 1

  • edit:我注意到你可能已经尝试过列的相反顺序,因为estSoumis是tinyint,这个顺序可能会表现得更好。我有这个答案坐在编辑没有张贴和离开它过夜的错误,然后张贴,看到另一个答案。*

相关问题