From 138691df7a2426834cdfb50f719bbed1b9c46c3e Mon Sep 17 00:00:00 2001 From: Brian Horisk Date: Mon, 20 Apr 2026 12:06:03 +0100 Subject: [PATCH] Add composite index api_queue_poll for data_api_queue dequeue pattern Dequeue queries filter on subscriber, queue_name, and namespace and order by order_number. Previously MariaDB could use index_merge plus filesort; the composite (subscriber, queue_name, namespace, order_number) aligns with DataApiQueueService.getNextQueuedItems and getQueueCount. Deploying requires Preside DB sync to create the new physical index. Made-with: Cursor --- preside-objects/data_api_queue.cfc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/preside-objects/data_api_queue.cfc b/preside-objects/data_api_queue.cfc index bcbfbab..f14e8ed 100644 --- a/preside-objects/data_api_queue.cfc +++ b/preside-objects/data_api_queue.cfc @@ -10,16 +10,16 @@ */ component { property name="object_name" type="string" dbtype="varchar" maxlength=100 required=true indexes="object_name" renderer="DataApiQueueObjectName"; - property name="namespace" type="string" dbtype="varchar" maxlength=50 required=false indexes="namespace"; - property name="queue_name" type="string" dbtype="varchar" maxlength=50 required=false indexes="queuename"; + property name="namespace" type="string" dbtype="varchar" maxlength=50 required=false indexes="namespace,api_queue_poll|3"; + property name="queue_name" type="string" dbtype="varchar" maxlength=50 required=false indexes="queuename,api_queue_poll|2"; property name="record_id" type="string" dbtype="varchar" maxlength=100 required=true indexes="record_id"; property name="operation" type="string" dbtype="varchar" maxlength=10 required=true indexes="operation" enum="dataApiQueueOperation"; - property name="order_number" type="numeric" dbtype="int" required=true indexes="ordernumber" generate="insert" generator="method:getNextOrderNumber"; + property name="order_number" type="numeric" dbtype="int" required=true indexes="ordernumber,api_queue_poll|4" generate="insert" generator="method:getNextOrderNumber"; property name="is_checked_out" type="boolean" dbtype="boolean" required=false indexes="checkedout" default=false; property name="check_out_date" type="date" dbtype="datetime" required=false indexes="checkedoutdate"; property name="data" type="string" dbtype="longtext" required=false; - property name="subscriber" relatedto="rest_user" relationship="many-to-one" required=true; + property name="subscriber" relatedto="rest_user" relationship="many-to-one" required=true indexes="api_queue_poll|1"; public numeric function getNextOrderNumber() { var record = this.selectData( selectFields = [ "Max( order_number ) as order_number" ] );