Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

166
Vistas
Acelere las consultas MySQL (no almacenables)

Tengo un código de prueba de sesión de PHP, para garantizar que el usuario que inició sesión sea válido. Solo explicaré algunas de las funciones: is_logged_in solo verifica si algunas variables de sesión están configuradas y test_duplicate conecta a la base de datos para verificar si hay una fila con una columna que iguala el valor.

 function check_account(){ if(is_logged_in()){ // Destroy session if the user doesn't exist. if(test_duplicate("username", $_SESSION["user"])){ session_destroy(); } } if($_SESSION["valid_day"] != date("Ymd")){ // Destroy session if the key has expired session_destroy(); } } function test_duplicate($field, $value){ $mysqli = database_connect(); $statement = $mysqli->prepare("SELECT * FROM users WHERE " . $field . " = ?"); $statement->bind_param("s", $value); $statement->execute(); $statement->store_result(); $rows = $statement->num_rows; if($rows > 0){ return FALSE; } return TRUE; } function database_connect(){ if(!isset($dbconnection)){ $config = get_configuration(); // Create connection $mysqli = new mysqli($config["hostname"], $config["username"], $config["password"], $config["database"]); if($mysqli->connect_error){ die("<h1>Error 1 :: Critical backend failure</h1>"); } if(!check_tables($mysqli)){ die("<h1>Error 2 :: Critical backend failure</h1>"); } $dbconnection = $mysqli; return $mysqli; }else{ return $dbconnection; } }

Los problemas:

  • Esta función test_duplicate tarda entre 3 y 4 segundos en completarse
  • El almacenamiento en caché no funcionará porque necesito probar ese valor (está determinando si el usuario aún existe en la base de datos)

Mis soluciones actuales (no creo que sean particularmente buenas):

  • Solo ejecutar el código al azar (es decir, una probabilidad de 1/5)
  • No ejecutar el código (pero no estoy seguro de cómo implementar esto alternativamente)
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Yo sugeriría:

  1. Agregue código de depuración para medir cuánto tiempo lleva cada línea de código en la función test_duplicate .
  2. Almacenar en caché la conexión y compartirla entre sus componentes como sugiere @jeroen en los comentarios.
  3. En lugar de seleccionar todos los campos con select * , devuelve un único valor entero. Mejor aún, en lugar de manejarlo como una consulta que devuelve una fila, hágalo como una consulta escalar que devuelve un valor único.

Actualizar

Aquí hay una consulta que devuelve 1 si hay una fila con un valor específico en el nombre de username ; o 0 si no existe ninguna fila coincidente:

 select ifnull( ( select 1 as user_exists from dual where exists( select * from users where username = 'test2' ) ), 0) as result from dual
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda