我将我的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
答案 0 :(得分:1)
一些建议:
将您的UUID
字段从128
确保所有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/