Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [MySql]

  1. #1

    [MySql]

    Salve a tutti, mi scuso fin d'ora se l'argomento o la sezione non sono appropriati, ma avrei bisogno di un aiuto. Ho un database di libri con molte voci (circa 560'000). La struttura della tabella è la seguente:
    Codice PHP:
    CREATE TABLE IF NOT EXISTS `libri` (
      `
    idint(10NOT NULL auto_increment,
      `
    eanvarchar(13NOT NULL,
      `
    tipo_prodottovarchar(2NOT NULL,
      `
    autore1varchar(35NOT NULL,
      `
    autore2varchar(35NOT NULL,
      `
    autore3varchar(35NOT NULL,
      `
    curatore1varchar(50NOT NULL,
      `
    curatore2varchar(50NOT NULL,
      `
    curatore3varchar(50NOT NULL,
      `
    traduttore1varchar(25NOT NULL,
      `
    traduttore2varchar(25NOT NULL,
      `
    traduttore3varchar(25NOT NULL,
      `
    illustratore1varchar(25NOT NULL,
      `
    illustratore2varchar(25NOT NULL,
      `
    titolo_compostovarchar(340NOT NULL,
      `
    prefisso_titolovarchar(6NOT NULL,
      `
    titolovarchar(165NOT NULL,
      `
    numero_volumevarchar(7NOT NULL,
      `
    titolo_partevarchar(155NOT NULL,
      `
    data_edizioneint(4NOT NULL,
      `
    numero_edizionevarchar(6NOT NULL,
      `
    data_fuori_catalogoint(6NOT NULL,
      `
    data_prevista_pubblint(6NOT NULL,
      `
    codice_editoreint(6NOT NULL,
      `
    editorevarchar(30NOT NULL,
      `
    disponibilitavarchar(1NOT NULL,
      `
    prezzoint(8NOT NULL,
      `
    codice_collanavarchar(12NOT NULL,
      `
    desc_collanavarchar(51NOT NULL,
      `
    numerazione_collanavarchar(15NOT NULL,
      `
    tascabilevarchar(1NOT NULL,
      `
    formatovarchar(2NOT NULL,
      `
    illustrazionivarchar(21NOT NULL,
      `
    paginevarchar(15NOT NULL,
      `
    numero_tot_volumiint(3NOT NULL,
      `
    scolasticovarchar(1NOT NULL,
      `
    cod_cat1_ccevarchar(10NOT NULL,
      `
    cod_cat2_ccevarchar(10NOT NULL,
      `
    cod_cat3_ccevarchar(10NOT NULL,
      `
    cod_cat4_ccevarchar(10NOT NULL,
      `
    desc_cat1_ccevarchar(80NOT NULL,
      `
    desc_cat2_ccevarchar(80NOT NULL,
      `
    desc_cat3_ccevarchar(80NOT NULL,
      `
    desc_cat4_ccevarchar(80NOT NULL,
      `
    cod_qual1_ccevarchar(10NOT NULL,
      `
    cod_qual2_ccevarchar(10NOT NULL,
      `
    cod_qual3_ccevarchar(10NOT NULL,
      `
    cod_qual4_ccevarchar(10NOT NULL,
      `
    desc_qual1_ccevarchar(80NOT NULL,
      `
    desc_qual2_ccevarchar(80NOT NULL,
      `
    desc_qual3_ccevarchar(80NOT NULL,
      `
    desc_qual4_ccevarchar(80NOT NULL,
      `
    codice_deweyint(3NOT NULL,
      `
    desc_class_liv1varchar(42NOT NULL,
      `
    desc_class_liv2varchar(42NOT NULL,
      `
    cod_cat_mercevarchar(2NOT NULL,
      `
    desc_cat_mercevarchar(20NOT NULL,
      `
    cod_genere_lettvarchar(2NOT NULL,
      `
    desc_genere_lettvarchar(20NOT NULL,
      `
    classicovarchar(1NOT NULL,
      `
    soggetto1varchar(30NOT NULL,
      `
    soggetto2varchar(30NOT NULL,
      `
    soggetto3varchar(30NOT NULL,
      `
    abstracttext NOT NULL,
      
    PRIMARY KEY  (`id`),
      
    KEY `ean` (`ean`),
      
    KEY `titolo` (`titolo`),
      
    KEY `titolo_composto` (`titolo_composto`),
      
    KEY `data_edizione` (`data_edizione`),
      
    KEY `autore1` (`autore1`),
      
    KEY `autore2` (`autore2`),
      
    KEY `autore3` (`autore3`),
      
    KEY `indice` (`autore1`,`autore2`,`autore3`,`titolo_composto`,`editore`,`ean`)
    ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=546625 
    La query che effettuo nelle ricerche è qualcosa del tipo:
    Codice PHP:
    SELECT FROM (`libri`) WHERE (autore1 LIKE '%mario%' OR autore2 LIKE '%mario%' OR autore3 LIKE '%mario%' OR titolo_composto LIKE '%mario%' OR ean LIKE '%mario%' OR editore LIKE '%mario%' OR 0) AND (autore1 LIKE '%rossi%' OR autore2 LIKE '%rossi%' OR autore3 LIKE '%rossi%' OR titolo_composto LIKE '%rossi%' OR ean LIKE '%rossi%' OR editore LIKE '%rossi%' OR 0) AND 1 ORDER BY `data_edizionedesc LIMIT 4 
    Come vedete ho creato sia gli indici per i campi dove effettuo la ricerca sia un indice unico con i campi utilizzati, se però faccio l'explain della query ottengo:

    id: 1
    select_type: SIMPLE
    table: libri
    type: index
    possible_keys: NULL
    key: data_edizione
    key_len: 4
    ref: NULL
    rows: 543749
    Extra: Using where

    quindi non viene usato nessun indice veramente utile alla ricerca, ma solo quello relativo all'ordinamento...

    Avete qualche suggerimento da darmi per velocizzare le query?
    Purtroppo sono vincolato alla struttura della tabella che è legata al catalogo nazionale

    Grazie infinite per la pazienza.

  2. #2
    se usi il carattere % nel LIKE prima del nome da cercare non verranno utilizzati gli indici.

    Visto che usi le tabelle myisam ti consiglio di creare degli indici fulltext.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.