Estoy trabajando en mi propio motor de almacenamiento para MySQL. Hasta ahora, este motor de almacenamiento funciona de manera confiable y correcta, pero solo para tablas pequeñas (~ 100 MB) ... Para tablas grandes, aparece un error de segmentación cuando intento ejecutar una consulta con un pedido por, algo así dará lugar a una violación de segmento:Mi propio motor de almacenamiento se cuelga debido a un pequeño sort_buffer
select * from item order by i_author;
Así que he recopilado MySQL en modo de depuración, y vio, que el ahora hay un error de aserción en la función merge_buffers en filesort.cc:
/* The following will fire if there is not enough space in sort_buffer */
DBUG_ASSERT(maxcount!=0);
Honestamente no tengo idea de qué puedo cambiar en mi motor de almacenamiento para que desaparezca este error. Al principio parecía que tenía que cambiar el parámetro de configuración sort_buffer_size - pero incluso establecer esto más alto que el tamaño de la tabla cambia algo con este error.
¿Alguien que sepa cómo escribir motores de almacenamiento MySQL tiene alguna idea de cómo resolver esto?
Ah muchas gracias, esta pista realmente resolvió el problema. De acuerdo con la documentación, no es obligatorio dar una estimación correcta del tamaño de la mesa, obviamente la documentación es incorrecta. Lo que hice ahora es registrar el alto de mi B + -Tree desde mi índice de clave binaria y calcular un límite superior para el tamaño de eso (ya que solo se necesita una estimación, dar el valor correcto sería demasiado caro). Ahora todas mis pruebas se ejecutan en grandes mesas. ¡Muchas gracias por ese consejo! –