Ok, quindi le soluzioni che circondano questa domanda in realtà comportano un po 'di sfumatura. Sono andato avanti e ho deciso di rispondere, ma volevo anche affrontare alcune delle sfumature/dettagli che i commenti non stanno ancora affrontando.
Prima di tutto, vorrei fortemente sconsigliarvi di utilizzare auto_increment sulla chiave primaria, se non altro per il fatto che è molto facile che gli ID di incremento automatico vengano espulsi (ad esempio, le transazioni di rollback interferiranno con loro MySQL AUTO_INCREMENT does not ROLLBACK. Così eliminerà, come menzionato @Sebas).
In secondo luogo, è necessario considerare il motore di archiviazione. Se si utilizza MyISAM, è possibile ottenere molto rapidamente un COUNT (*) della tabella (poiché MyISAM riconosce sempre quante righe sono presenti in ogni tabella). Se stai usando INNODB, non è così. A seconda di cosa ti serve questa tabella, potresti riuscire a cavartela con MyISAM. Non è il motore predefinito, ma è certamente possibile che si possa incontrare un requisito per il quale MyISAM sarebbe una scelta migliore.
La terza cosa che dovresti chiederti è "Perché?" Perché hai bisogno di archiviare i tuoi dati in questo modo? Cosa ti dà effettivamente? Hai davvero bisogno di quelle informazioni in SQL? Nella stessa tabella della stessa tabella SQL?
E se il "Perché" ha una risposta che ne giustifica l'uso, l'ultima cosa che chiedo è "come?" In particolare, come hai intenzione di gestire inserti concomitanti? Come hai intenzione di gestire eliminazioni o rollback?
Dato il requisito che si ha, fare un conteggio stella della tabella è fondamentalmente necessario ... ma anche allora, ci sono alcune sfumature (eliminazioni, rollback, concorrenza) e anche alcune decisioni da prendere (quale motore di archiviazione usi, puoi usare MyISAM, che sarà più veloce per contare le stelle?).
Più di ogni altra cosa, però, mi chiederei perché avevo bisogno di questo in primo luogo. Forse lo fai davvero ... ma è un requisito terribilmente strano.
alla luce della tua EDIT:
EDIT: La ragione di questo è è quello di essere in grado di ordinare la tabella per quel particolare settore; e che il campo sarebbe stato manipolato da un utente nel lato client utilizzando ordinabile di jQuery
Essenzialmente quello che chiediamo è metadati relativi le tabelle. E vorrei raccomandare di memorizzare quei metadati in una tabella separata o in un servizio separato del tutto (ricerca elastica, redis, ecc.). Dovresti aggiornare periodicamente quella tabella separata (o l'archivio dei valori chiave). Se lo facevi in SQL, potresti usare un trigger. O hai usato qualcosa come Elastic Search, potresti inserire i tuoi dati in SQL e ES contemporaneamente. Ad ogni modo, hai alcuni problemi spinosi con cui devi fare i conti (ad esempio, consistenza finale, concorrenza, tutte le cose gloriose che possono ritorcersi contro quando usi i trigger in MySQL).
Se fossi in me, annoterei due cose. Uno, nemmeno Google consegna sempre aggiornato COUNT(*)
. "Mostra righe 1-10 su circa XYZ." Lo fanno in parte perché hanno più dati che immagino tu faccia, e in parte perché in realtà è poco pratico (e molto rapidamente diventa irrealizzabile e proibitivo) calcolare un esatto COUNT(*)
di un tavolo e tenerlo aggiornato in ogni momento .
Quindi, o cambierei completamente il mio requisito e sfruttare una statistica che posso ottenere rapidamente (se si utilizza MyISAM per l'archiviazione, andare avanti e utilizzare count(*)
... sarà molto veloce) o prenderei in considerazione il mantenimento un indice delle stelle di conteggio delle mie tabelle che periodicamente si aggiorna tramite alcuni processi (cron job, trigger, qualunque) ogni due ore o ogni giorno o qualcosa del genere.
In merito alla taglia su questa domanda ... non ci sarà mai una sola risposta canonica a questa domanda. Ci sono dei compromessi da fare indipendentemente da come decidi di gestirlo. Potrebbero essere dei compromessi in termini di coerenza, latenza, scalabilità, soluzioni precise e approssimative, perdere INNODB in cambio di MyISAM ... ma ci saranno dei compromessi. E alla fine la decisione si riduce a ciò che sei disposto a scambiare per ottenere il tuo requisito.
Se fossi in me, probabilmente fletterei la mia richiesta. E se lo facessi, probabilmente finirò per indicizzarlo in Elastic Search e assicurarmi che sia aggiornato fino a un paio d'ore circa. È questo che dovresti fare? Dipende. Certamente non è una "risposta giusta" tanto quanto è una risposta (tra le tante) che funzionerebbe se potessi vivere con il mio count(*)
diventando un po 'obsoleto.
Si dovrebbe utilizzare la ricerca elastica per questo? Dipende. Ma avrai a che fare con compromessi che ti porteranno sempre. Questo non dipende. E dovrai decidere cosa sei disposto a rinunciare per ottenere quello che vuoi. Se non è critico, fletti il requisito.
Penso che si desidera un auto_increment chiave primaria. [Prova a dare un'occhiata a questo.] (Http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html) – AdamMc331
@ McAdam331 Posso avere due colonne auto_increment? Ho già una chiave primaria auto_increment, chiamiamola field_id –
Non è possibile avere due autoincrementi, sfortunatamente. A seconda del tuo utilizzo per questo, forse qualcosa deve cambiare a livello di applicazione. Diciamo che nella tua applicazione devi accedere a questa colonna 'field_order'. Invece, puoi accedere a 'field_id' e incrementarlo. Potrebbe essere o non essere una buona soluzione, a seconda del problema. – AdamMc331