MYSQL 版本 5.6.23
中心操作系统 7
你好,
我有以下来自我希望从事物的 mysql 方面提高效率的应用程序的查询。
我在表“文件”、“文件系统”和“实例”中的每一列上建立了一个索引。
SELECT t0_f.pk, t0_f.created_time, t0_f.md5_check_time, t0_f.filepath, t0_f.file_tsuid, t0_f.file_md5, t0_f.file_status, t0_f.file_size, t0_f.instance_fk, t0_f.filesystem_fk
FROM files t0_f, filesystem t1_f_fileSystem, instance t2_f_instance
WHERE (t0_f.file_status = 0
AND t0_f.file_tsuid
IN ('1.2.840.10008.1.2', '1.2.840.10008.1.2.1', '1.2.840.10008.1.2.2')
AND t1_f_fileSystem.pk = 1
AND t2_f_instance.sop_cuid = '1.2.840.10008.5.1.4.1.1.2'
AND t0_f.created_time < '2015-03-26 09:29:58'
AND t0_f.filesystem_fk=t1_f_fileSystem.pk
AND t0_f.instance_fk=t2_f_instance.pk)
这是解释:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
'1', 'SIMPLE', 't1_f_fileSystem', 'const', 'PRIMARY', 'PRIMARY', '8', 'const', '1', '100.00', 'Using index'
'1', 'SIMPLE', 't0_f', 'ref', 'instance_fk,filesystem_fk,file_tsuid,file_created,file_status', 'filesystem_fk', '9', 'const', '74220028', '100.00', 'Using where'
'1', 'SIMPLE', 't2_f_instance', 'eq_ref', 'PRIMARY,sop_cuid', 'PRIMARY', '8', 'pacsdb.t0_f.instance_fk', '1', '100.00', 'Using where'
这可能会受益于“组合”索引,还是有任何其他方法可以改进“解释”而不是更改查询,因为我无法控制它。
如果还有什么我可以发布的帮助,请告诉我!
谢谢
更新
我创建了一个索引“files_compress”(您建议的第一个索引),通过“索引范围扫描”,它的估计值下降到 310 万行。我也添加了第二个,但它并没有改变结果。
这是新的“解释”
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
'1', 'SIMPLE', 't1_f_fileSystem', 'const', 'PRIMARY', 'PRIMARY', '8', 'const', '1', '100.00', 'Using index'
'1', 'SIMPLE', 't0_f', 'range', 'instance_fk,filesystem_fk,file_tsuid,file_created,file_status,files_compress,files_compress_2', 'files_compress', '772', NULL, '3192823', '100.00', 'Using index condition; Using where'
'1', 'SIMPLE', 't2_f_instance', 'eq_ref', 'PRIMARY,sop_cuid', 'PRIMARY', '8', 'pacsdb.t0_f.instance_fk', '1', '100.00', 'Using where'
你觉得还有什么可以改进的地方吗?我知道它比 74M 行更好!
再次感谢!
在 上
files
,添加这些复合索引:(我不确定哪个会更有帮助。)