2011-01-04 12 views
5

Obtuve una tabla de usuario que contiene más de 15 millones de registros y mientras hago la función de registro, deseo verificar si el nombre de usuario ya existe. Hice la indexación para la columna de nombre de usuario y cuando ejecuto la consulta "select count(uid) from users where username='webdev'", .mmmm, sigue cargando la pantalla en blanco finalmente colgada. Estoy haciendo esto en mi servidor local con php 5 & mysql 5. Así que sugiero una técnica para manejar . esta situaciónmanipulando más de 15 millones de registros en mysql con php?

es que mongodb es buena alternativa para el manejo de este proceso en nuestra máquina local?

Gracias, Nithish.

+0

Realmente no entiendo su error, pero ¿tiene un índice en "nombre de usuario". ... que seguro ayudaría :) –

+1

ejecuta esta consulta, luego edita la pregunta con los resultados: 'explica el recuento de selecciones (uid) de los usuarios donde nombre de usuario = 'webdev'' – sberry

+2

Como referencia, tenemos una tabla de usuarios con más de 40 millones filas y realizamos casi la misma consulta cada vez que se produce un registro. La consulta debe tomar fracciones de segundo en una tabla correctamente indexada y correctamente diseñada. – sberry

Respuesta

5

Si lo que desea es comprobar que existe o no, tratar no usando el count. Solo un simple select username from users where username='webdev' LIMIT 1 puede ser más rápido.

TAMBIÉN, cambie el tipo de columna a varchar, si no es así. No use el tipo text. Es mucho más lento.

+0

no realmente, 'count (*) o count (username)' no ralentiza las cosas – ajreal

+1

@ajreal, pero 'LIMIT 1' puede acelerar las cosas :) – shamittomar

+0

@shamittomar - no puede suponer que OP almacena un nombre de usuario no único ... – ajreal

2

Esto podría ser un punto discutible, pero para probar y ver si el nombre de usuario ya existe, me gustaría emitir la siguiente consulta (una ligera modificación en la consulta del shamittomar):

SELECT DISTINCT `username` FROM `users` WHERE `username` = 'webdev'; 

Esta voluntad, por defecto , devuelve la única instancia de "webdev" en la columna "nombre de usuario"; sin embargo, si agrega más parámetros, podría cambiar sus resultados. Un ejemplo de ello es, si ejecuta

SELECT DISTINCT `user_id`, `username` FROM `users` WHERE `username` = 'webdev'; 

sería devolver todas las combinaciones únicas de "user_id" y "nombre de usuario".

2

Una cosa que puedes hacer es cambiar la indexación del nombre de usuario de index to unique que hará que la búsqueda sea mucho más rápida y como shamittomar dijo agregar un limit 1 al final aunque solo ayudará si el valor ya existe.

+0

Un índice único es lo que necesita el OP, un SELECT nunca puede garantizar ninguna singularidad. –

0

su nombre de usuario es único por lo que debe establecer límite de 1 en su consulta que será más rápido

select count(uid) from users where username='webdev' limit 1 
Cuestiones relacionadas