Yugabyte Cloud Query Language (YCQL) is a semi-relational SQL API that is best fit for internet-scale OLTP and HTAP applications needing massive data ingestion and blazing-fast queries. It has its roots in the Cassandra Query Language (CQL).
-- Select all columnsSELECT * FROM users WHERE user_id = uuid();-- Select specific columnsSELECT username, email FROM users WHERE user_id = uuid();-- Select with limitSELECT * FROM users LIMIT 10;
-- Delete entire rowDELETE FROM users WHERE user_id = uuid();-- Delete specific columnsDELETE email FROM users WHERE user_id = uuid();-- Delete with conditionDELETE FROM users WHERE user_id = uuid()IF email = '[email protected]';-- Delete from collectionDELETE tags['old_tag'] FROM user_profile WHERE user_id = uuid();
YCQL supports secondary indexes for non-primary-key queries.
-- Create indexCREATE INDEX idx_users_email ON users(email);-- Create index on collectionCREATE INDEX idx_user_tags ON user_profile(tags);-- Create index on JSON fieldCREATE INDEX idx_product_brand ON products(attributes->>'brand');-- Use index in querySELECT * FROM users WHERE email = '[email protected]';-- Drop indexDROP INDEX idx_users_email;
-- Generate random UUIDSELECT uuid();-- Generate time-based UUIDSELECT now();-- Convert TIMEUUID to timestampSELECT toTimestamp(now());-- Extract date from TIMEUUIDSELECT toDate(now());
Date/Time Functions
-- Current timestampSELECT toTimestamp(now());-- Current dateSELECT toDate(now());-- Convert timestamp to dateSELECT toDate(created_at) FROM users;
Type Conversion
-- Convert typesSELECT CAST(count AS TEXT) FROM metrics;-- Convert to/from blobSELECT textAsBlob('hello');SELECT blobAsText(data);
Aggregate Functions
-- Count rowsSELECT COUNT(*) FROM users;-- Sum valuesSELECT SUM(amount) FROM transactions;-- AverageSELECT AVG(temperature) FROM sensor_data WHERE sensor_id = 1;-- Min/MaxSELECT MIN(temperature), MAX(temperature) FROM sensor_data;
Choose partition keys that distribute data evenly:
-- Good: Even distributionCREATE TABLE events ( event_id UUID, timestamp TIMESTAMP, PRIMARY KEY (event_id, timestamp));-- Better: Add bucketing for very high cardinalityCREATE TABLE events ( bucket INT, event_id UUID, timestamp TIMESTAMP, PRIMARY KEY ((bucket, event_id), timestamp));
Use Clustering Columns for Range Queries
Design tables for your query patterns:
-- Optimized for time-range queriesCREATE TABLE user_activity ( user_id UUID, activity_date DATE, activity_time TIMESTAMP, action TEXT, PRIMARY KEY (user_id, activity_date, activity_time)) WITH CLUSTERING ORDER BY (activity_date DESC, activity_time DESC);
Leverage TTL for Automatic Data Expiry
Use TTL for temporary data:
-- Table-level TTLCREATE TABLE cache ( key TEXT PRIMARY KEY, value TEXT) WITH default_time_to_live = 86400; -- 24 hours-- Row-level TTLINSERT INTO cache (key, value) VALUES ('temp', 'data')USING TTL 3600; -- 1 hour
Minimize Use of ALLOW FILTERING
Avoid ALLOW FILTERING in production:
-- Bad: Requires full table scanSELECT * FROM users WHERE email = '[email protected]' ALLOW FILTERING;-- Good: Create indexCREATE INDEX idx_users_email ON users(email);SELECT * FROM users WHERE email = '[email protected]';
Use Batches for Multiple Writes
BEGIN BATCH INSERT INTO users (user_id, username) VALUES (uuid(), 'user1'); INSERT INTO user_profile (user_id, bio) VALUES (uuid(), 'bio1'); UPDATE user_stats SET login_count = login_count + 1 WHERE user_id = uuid();APPLY BATCH;