sql >> Database >  >> RDS >> Mysql

Mysql te traag bij eenvoudige query tussen twee tabellen

In InnoDB bevat elke index impliciet de primaire sleutel.

Het uitlegplan laat zien dat index IDX_NOME wordt gebruikt op tafel Paziente . Het DBMS zoekt de naam op in de index en vindt ID_PAZIENTE daarin, wat de sleutel is die we nodig hebben om toegang te krijgen tot de andere tafel. Er valt dus niets toe te voegen. (In een ander DBMS zouden we een samengestelde index hebben toegevoegd op (NOME, ID_PAZIENTE) om dit te laten gebeuren.)

Dan is er tabel Analisi overwegen. We vinden een record via FK_ANALISI_PAZIENTE die de ID_PAZIENTE . bevat die wordt gebruikt om de overeenkomst te vinden, en impliciet de primaire sleutel ID_ANALISI die zou kunnen worden gebruikt om toegang te krijgen tot de tabel, maar dit is niet eens nodig, omdat we alle informatie hebben die we nodig hebben uit de index. Er is niets meer dat we in de tabel moeten vinden. (Nogmaals, in een ander DBMS zouden we een samengestelde index hebben toegevoegd op (ID_PAZIENTE, ID_ANALISI) om een ​​dekkingsindex te hebben.)

Dus wat er gebeurt is slechts:lees de ene index om de andere index te lezen om te tellen. Perfect. Er valt niets toe te voegen.

We kunnen vervang COUNT(analisi0_.ID_ANALISI) met COUNT(*) zoals de eerste zegt alleen "tel records waar ID_ANALISI is niet null", wat altijd het geval is als ID_ANALISI is de primaire sleutel van de tabel. Het is dus eenvoudiger om de laatste te gebruiken en "records tellen" te zeggen. Ik verwacht echter niet dat dit de zoekopdracht aanzienlijk of helemaal niet zal versnellen.

Dus vanuit het oogpunt van query's is er niets om dit te versnellen. Hier zijn nog meer dingen die in je opkomen:

  • Gepartitioneerde tabellen? Nee, ik zou hier geen voordeel in zien. Het zou sneller kunnen zijn als de query dan in parallelle threads wordt uitgevoerd, maar voor zover ik weet, is er geen parallelle uitvoering op meerdere partities in MySQL. (Ik kan me echter vergissen.)
  • Defragmenteren van de tabellen? Nee, de tabellen zelf zijn niet eens toegankelijk in de query.
  • Dat houdt ons over:koop betere hardware. (Sorry dat ik geen beter advies voor je heb.)



  1. Hoe update je meerdere velden uit een andere tabel in mysql?

  2. Drupal Database Structuur - Efficiënt/Inefficiënt?

  3. Hoeveel sneller is de tijdstempel dan de datetime-kolom in MySQL?

  4. MySQL-externe sleutel om NULL toe te staan?