0

我有我的 UUID 作为字符串,我的数据库中有数千个项目。我的查询看起来甚至是基本的似乎需要几秒钟才能加载 - 当我做更复杂的查询时,我们正在谈论几分钟的时间。

我相信我最大的瓶颈是我要进行数千次字符串比较

有没有办法让我的数据库保持原样 - 但将查询语法转换为将 UUID 转换为数字?

或者,如果这无济于事,我该如何将字符串转换为数字?

谢谢

编辑:

我有 16 个表都相互连接,很难发布它们是如何相互连接的,但这里有一些示例:

field  Type
UUID - TEXT 

"SELECT * FROM customer WHERE UUID = '$custUUID'";

如果我从 phpmyadmin 运行它,这个简单的查询需要 0.7 秒,我尝试这样做数百次 = 加载时间过长

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.6967 sec )
SELECT * 
FROM customer
WHERE UUID = '1234'
LIMIT 0 , 30

这是一个更复杂的查询示例,需要很长时间 reportdate、contract_UUID、customer_UUID、garcom_UUID 和 city_UUID 都是文本类型

$query = "SELECT DISTINCT a.weekreportDate FROM contract_sales a 
    INNER JOIN contract b ON a.contract_UUID = b.UUID
    INNER JOIN geoPoint c ON b.customer_UUID = c.customerUUID
    WHERE c.garcom_UUID = '$garbcom'
    AND c.city_UUID = '$cit' ORDER BY `report_date`";

这是 phpmyadmin http://prntscr.com/1airfd中的一张表的图像

4

2 回答 2

2

在查看我的用例时,我遇到了一种更快的方法。

Sweet & short - 将所有字符串字段(UUID)转换为整数(可以通过使用SHA 哈希函数计算唯一键来索引(我们将讨论冲突,但这是另一次)这是执行此操作的简单方法(参数取决于在您的个人唯一(子字段或其一部分)上

select distinct(CONV(SUBSTRING(CAST(SHA(Concat(text_field_1,text_field_2)) AS CHAR), 1, 16), 16, 10))
from table_name

#Post this you will get integer mappings(which can be readily indexed) like -:
"14686325187172356814"
"4176431494776658251"
"17905162221625924418"
"17418684985242853706"
"2795298138913147719"
"17371106411384154394" .. more 

当然,另一种方式(即研磨)将是创建这些独特组合的下拉列表 - 然后在这些桶中编制索引 - 这是 SHA 真正做的 - 分配桶)

正如您所注意到的,我实际上是通过合并两列 text_field_1 &text_field_2 来创建唯一(主)键。您可以采用子字符串或最适合您的数据类型和范围的任何内容。此处详细说明了数字 16、1、16,10 以及如何设计此 SHA 函数 - http://greenash.net.au/thoughts/2010/03/generating-unique-integer-ids-from -strings-in-mysql/

于 2014-02-03T18:57:47.043 回答
1

Some suggestions:

Shorten your UUID fields to 16 char from 128

Make sure all your UUID fields are indexed.

Don't SELECT *, It's bad practice and it can increase your load times. Just select what you need.

You say you use

"SELECT * FROM customer WHERE UUID = '$custUUID'";

thousands of times. Would it be possible to do this:

"SELECT * FROM customer WHERE UUID IN ( '".implode(',',$custUUID)."')";

where $custUUID is an array of UUIDs?

于 2013-06-18T00:51:46.817 回答