android - Android联系人数据库:如何高度优化手机查找表?
问题描述
当我想使用 phone_lookup 表查询 display_name 时,我发现介绍如下:
'表示查找电话号码结果的表格,例如来电显示。要执行查找,您必须将要查找的数字附加到 CONTENT_FILTER_URI。此查询在 android 开发人员中高度优化。
但我不知道谷歌是如何优化这个查询的?
https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup
我查询了一下,最后解释如下:
SELECT data1 AS number,
contacts_view._id AS contact_id,
contacts_view.photo_uri AS photo_uri,
contacts_view.send_to_voicemail AS send_to_voicemail,
data_id AS data_id,
contacts_view.lookup AS lookup,
contacts_view.display_name AS display_name,
contacts_view.last_time_contacted AS last_time_contacted,
contacts_view.has_phone_number AS has_phone_number,
contacts_view.in_visible_group AS in_visible_group,
contacts_view.photo_file_id AS photo_file_id,
data3 AS label,
contacts_view.starred AS starred,
data4 AS normalized_number,
contacts_view.photo_thumb_uri AS photo_thumb_uri,
contacts_view.in_default_directory AS in_default_directory,
contacts_view.photo_id AS photo_id,
contacts_view.custom_ringtone AS custom_ringtone,
contacts_view._id AS _id,
data2 AS type,
contacts_view.times_contacted AS times_contacted
FROM raw_contacts
JOIN
view_contacts AS contacts_view ON (contacts_view._id = raw_contacts.contact_id),
(
SELECT data_id,
normalized_number,
length(normalized_number) AS len
FROM phone_lookup
WHERE (phone_lookup.min_match = '.....')
)
AS lookup,
data
WHERE (lookup.data_id = data._id AND
data.raw_contact_id = raw_contacts._id AND
(lookup.normalized_number = '+......' OR
lookup.len <= 11 AND
substr('.....', 11 - lookup.len + 1) = lookup.normalized_number OR
(lookup.len > 11 AND
substr(lookup.normalized_number, lookup.len + 1 - 11) = '.....') ) )
ORDER BY length(lookup.normalized_number) DESC
解决方案
Thanks all,I've read source code.I found that 'highly optimized' means database level optimization instead of code level optimization.In more detail, Android create several nonclustered index in the phone_lookup table to improve query speed. https://blog.csdn.net/skysukai/article/details/84632943