@Entity(tableName = "messages",
indices = [
Index(value = ["id"]),
Index(value = ["reply_id"]), // Index for faster querying on reply_id
Index(value = ["chat_id"])
])
@TypeConverters(MessageConverters::class) // Add this line
data class Message(
@ColumnInfo(name = "chat_id")
val chatId: Int,
@ColumnInfo(name = "sender_id")
val senderId: Long,
@ColumnInfo(name = "recipient_id")
val recipientId: Long,
@ColumnInfo(name = "sender_message_id")
val senderMessageId: Long,
@ColumnInfo(name = "reply_id")
val replyId: Long,
@ColumnInfo(name = "content")
val content: String,
@ColumnInfo(name = "read")
val read: Boolean = false,
@ColumnInfo(name = "status")
val status:ChatMessageStatus = ChatMessageStatus.SENDING,
@ColumnInfo(name = "type")
val type:ChatMessageType = ChatMessageType.TEXT,
@ColumnInfo(name = "file_id")
val fileId:String?=null,
@ColumnInfo(name = "last_sent_chunk_index")
val lastSentChunkIndex:Int=-1,
@ColumnInfo(name = "last_sent_byte_offset")
val lastSentByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_byte_offset")
val lastSentThumbnailByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_chunk_index")
val lastSentThumbnailChunkIndex:Int=-1,
@ColumnInfo(name = "file_abs_path")
val fileAbsolutePath:String?=null,
@ColumnInfo(name = "thumb_path")
val fileThumbPath:String?=null,
@ColumnInfo(name = "thumb_data")
val thumbData:String?=null,
@ColumnInfo(name = "cache_path")
val fileCachePath:String?=null,
@ColumnInfo(name = "download_url")
val fileDownloadUrl:String?=null,
@ColumnInfo(name = "file_metadata")
val fileMetadata: FileMetadata?=null,
@ColumnInfo(name = "timestamp")
val timestamp: Long
) {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
// Function to convert ByteArray (thumbData) to Bitmap
fun getThumbnailBitmap(): Bitmap? {
return thumbData?.let {
File(thumbData).let {
if(it.exists()){
// Use 'use' to automatically close the stream after use
val options = BitmapFactory.Options().apply {
// Decode only bounds (no image data yet)
inJustDecodeBounds = true
}
// Step 1: Open the file input stream and decode just bounds
FileInputStream(it).use { inputStream ->
BitmapFactory.decodeStream(inputStream, null, options)
}
// Step 2: Set preferred config to save memory
options.inPreferredConfig = Bitmap.Config.RGB_565 // Uses 2 bytes per pixel instead of 4 (ARGB_8888)
// Step 3: Decode the image at full size (no scaling)
options.inJustDecodeBounds = false // Load the actual image data
options.inSampleSize = 1 // No scaling down, retain original size
// Step 4: Decode the image with the final options
FileInputStream(it).use { inputStream ->
BitmapFactory.decodeStream(inputStream, null, options)
}
}else{
null
}
}
}
}
}
@Deprecated("testing")
@Transaction
@Query("SELECT * FROM messages WHERE chat_id = :chatId ORDER BY id DESC LIMIT :limit")
fun getMessagesWithRepliesRaw1(chatId: Int, limit:Int): List
Я запрашиваю базу данных с 25 000 записями, но получение всего 20 результатов с использованием предложения LIMIT занимает значительное количество времени. Несмотря на то, что запрошено всего 20 строк, запрос выполняется медленнее, чем ожидалось. Вот запрос, который я использую:
Результаты возвращаются через несколько секунд (иногда даже дольше). Я проверил запрос на предмет базовой оптимизации производительности, например ограничения набора результатов, но проблема не устранена.
``
getMessagesWithRepliesRaw1(100,20)
``
[code] @Entity(tableName = "messages", indices = [ Index(value = ["id"]), Index(value = ["reply_id"]), // Index for faster querying on reply_id Index(value = ["chat_id"]) ]) @TypeConverters(MessageConverters::class) // Add this line
data class Message( @ColumnInfo(name = "chat_id") val chatId: Int,
@ColumnInfo(name = "sender_id") val senderId: Long,
@ColumnInfo(name = "recipient_id") val recipientId: Long,
@ColumnInfo(name = "sender_message_id") val senderMessageId: Long,
@ColumnInfo(name = "reply_id") val replyId: Long,
@ColumnInfo(name = "content") val content: String,
@ColumnInfo(name = "read") val read: Boolean = false,
@ColumnInfo(name = "status") val status:ChatMessageStatus = ChatMessageStatus.SENDING,
@ColumnInfo(name = "type") val type:ChatMessageType = ChatMessageType.TEXT,
@ColumnInfo(name = "file_id") val fileId:String?=null,
@ColumnInfo(name = "last_sent_chunk_index") val lastSentChunkIndex:Int=-1,
@ColumnInfo(name = "last_sent_byte_offset") val lastSentByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_byte_offset") val lastSentThumbnailByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_chunk_index") val lastSentThumbnailChunkIndex:Int=-1,
@ColumnInfo(name = "file_abs_path") val fileAbsolutePath:String?=null,
@ColumnInfo(name = "thumb_path") val fileThumbPath:String?=null,
@ColumnInfo(name = "thumb_data") val thumbData:String?=null,
@ColumnInfo(name = "cache_path") val fileCachePath:String?=null,
@ColumnInfo(name = "download_url") val fileDownloadUrl:String?=null,
@ColumnInfo(name = "file_metadata") val fileMetadata: FileMetadata?=null,
@ColumnInfo(name = "timestamp") val timestamp: Long
) { @PrimaryKey(autoGenerate = true) var id: Long = 0
// Function to convert ByteArray (thumbData) to Bitmap fun getThumbnailBitmap(): Bitmap? { return thumbData?.let { File(thumbData).let { if(it.exists()){
// Use 'use' to automatically close the stream after use val options = BitmapFactory.Options().apply { // Decode only bounds (no image data yet) inJustDecodeBounds = true }
// Step 1: Open the file input stream and decode just bounds FileInputStream(it).use { inputStream -> BitmapFactory.decodeStream(inputStream, null, options) }
// Step 2: Set preferred config to save memory options.inPreferredConfig = Bitmap.Config.RGB_565 // Uses 2 bytes per pixel instead of 4 (ARGB_8888)
// Step 3: Decode the image at full size (no scaling) options.inJustDecodeBounds = false // Load the actual image data options.inSampleSize = 1 // No scaling down, retain original size
// Step 4: Decode the image with the final options FileInputStream(it).use { inputStream -> BitmapFactory.decodeStream(inputStream, null, options) } }else{ null } }
} } } [/code] [code] @Deprecated("testing") @Transaction @Query("SELECT * FROM messages WHERE chat_id = :chatId ORDER BY id DESC LIMIT :limit") fun getMessagesWithRepliesRaw1(chatId: Int, limit:Int): List
[/code] Я запрашиваю базу данных с 25 000 записями, но получение всего 20 результатов с использованием предложения LIMIT занимает значительное количество времени. Несмотря на то, что запрошено всего 20 строк, запрос выполняется медленнее, чем ожидалось. Вот запрос, который я использую: Результаты возвращаются через несколько секунд (иногда даже дольше). Я проверил запрос на предмет базовой оптимизации производительности, например ограничения набора результатов, но проблема не устранена. `` getMessagesWithRepliesRaw1(100,20) ``
@Entity(tableName = messages ,
indices = [
Index(value = ),
Index(value = ), // Index for faster querying on reply_id
Index(value = )
])
@TypeConverters(MessageConverters::class) // Add this line
data class Message(
@ColumnInfo(name = chat_id )
val...
Я хочу показать почти сотню записей из базы данных. Но процесс очень медленный. Поэтому я пытаюсь добавить кусок в блейд
Вот мой контроллер
$user= User::where('status', '>=', '2')->get();
Вот мой view.blade.php
@foreach($user->chunk(100) as...
Две таблицы, s и c , находятся в отношениях с многими ко многим с CS в качестве средней таблицы. Каждая таблица имеет первичный ключ с именем идентификатором , а таблицы CS и c имеют столбец для удаленного (0 означает не удаляется, 1 означает...
Две таблицы, s и c , находятся в отношениях с многими ко многим с CS в качестве средней таблицы. Каждая таблица имеет первичный ключ с именем идентификатором , а таблицы CS и c имеют столбец для удаленного (0 означает не удаляется, 1 означает...
Две таблицы, s и c , находятся в отношениях с многими ко многим с CS в качестве средней таблицы. Каждая таблица имеет первичный ключ с именем идентификатором , а таблицы CS и c имеют столбец для удаленного (0 означает не удаляется, 1 означает...