mysql UUID as String如何加快查询速度

时间:2013-06-18 00:10:29

标签: php mysql uuid

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

我认为我最大的瓶颈是我正在进行数千次字符串比较

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

或者,如果这不能帮助我如何将我的字符串转换为数字?

谢谢

编辑:

我有16个表全部互连,很难发布所有这些表是如何互连的,但这里有几个样本:

field  Type
UUID - TEXT 

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

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

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

2 个答案:

答案 0 :(得分:1)

一些建议:

将您的UUID字段从128

缩短为16个字符

确保所有UUID字段都已编入索引。

不要SELECT *,这是不好的做法,它会增加你的加载时间。只需选择您需要的东西。

你说你用

"SELECT * FROM customer WHERE UUID = '$custUUID'";
成千上万次。是否可以这样做:

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

其中$ custUUID是一个UUID数组?

答案 1 :(得分:1)

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

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/