ventajas - sintaxis cassandra
modelado de datos en Cassandra con columnas que pueden ser texto o nĂºmeros (1)
Tengo una mesa con 5 columnas.
1. ID - number but it can stored as text or number
2. name - text
3. date - date value but can stored as date or text
4. time - number but it can stored as text or number
5. rating - number but it can stored as text or number
Quiero encontrar qué tipo de datos hará que mi tabla sea más rápida para escribir. Cómo puedo encontrar. ¿Alguna Cassandra estresará a Yaml por esto?
En cuanto a la respuesta que brindó @BryceAtNetwork23, será la misma con Cassandra 2.1 o con Cassandra 2.2 (pero Cassandra 3.0 probablemente será una historia diferente ya que el equipo está actualmente reescribiendo el motor de almacenamiento, ver CASSANDRA-8099 ). Los datos que se almacenan aún se almacenan en binario.
Sin embargo, hay más para decir allí. Y es posible que desee considerar la información real que se está almacenando, y el rendimiento que su proyecto necesita lograr, consultar por segundo, etc.
Dependiendo de estos objetivos o restricciones, un enfoque interesante es echar un vistazo al tamaño de los datos serializados para un tipo dado en cassandra .
Si los datos son un número, por ejemplo, con una
long
en Java que tiene un tamaño de 8 bytes, existe una coincidencia con el tipo de tamaño grande de cassandra, lo que significa que no hay ningún costo asociado al serializar, una copia sin formato servirá. También esto tiene la ventaja de que la clave es lo suficientemente pequeña para que no acentúe el caché de clave de cassandra.Si los datos son una pieza de texto, por ejemplo una
String
en Java, que está codificada en UTF-16 en el tiempo de ejecución, pero cuando se serializa en Cassandra context
se usa UTF-8. UTF-16 siempre usa 2 bytes por carácter y alguna vez 4 bytes, pero UTF-8 es eficiente en el uso del espacio y dependiendo del personaje puede tener 1, 2, 3 o 4 bytes de longitud.Eso significa que hay trabajo de CPU para serializar tales datos con el propósito de codificación / descodificación. También, dependiendo del texto, por ejemplo,
158786464563
, los datos se almacenarán con 12 bytes. Eso significa que se usa más espacio y más IO también.Tenga en cuenta que cassandra ofrece el tipo de
ascii
que sigue al juego de caracteres US-ASCII y siempre usa 1 byte por carácter .Si los datos son un UUID (un valor de 128 bits), en Java el tipo de
UUID
utiliza 2long
s, por lo que tiene 16 bytes de longitud, y Cassandra también los almacena como 16 bytes ( usan el tipo UUID de Java ).
De nuevo, eso siempre depende del kilometraje de su proyecto, cuáles son los objetivos, las limitaciones existentes. Pero aquí están mis opciones no educadas :
- Si la información que debe insertarse es siempre un número que está dentro del rango largo
[−9,223,372,036,854,775,808 ; +9,223,372,036,854,775,807]
[−9,223,372,036,854,775,808 ; +9,223,372,036,854,775,807]
, voy a obtener un tipobigint
- UUID está bien
- Si el clúster no tiene mucha carga (como 100.000 consultas por segundo) y el espacio no es un problema, entonces el
text
no es un problema, pero si lo es o si el uso puede crecer, evitaría eltext
para la clave, si es posible.
Otra opción es usar un tipo de blob
, es decir, un tipo binario, donde es posible utilizar cualquier información de la forma que desee de acuerdo con el negocio del software. Esto podría permitir un uso eficiente del espacio, un almacenamiento IO eficiente y una CPU eficiente también. Pero dependiendo de las necesidades, puede ser necesario administrar muchas cosas en el código del cliente, como ordenar, serializar, comparar, mapear, etc.