提高Mysql查询性能(索引类型使用说明)

时间:2017-11-26 15:43:14

标签: mysql performance query-performance

大家好我有以下数据库:

`Users`
'id', 'char(36)', 'NO', 'PRI', NULL, ''
'password', 'varchar(64)', 'NO', '', NULL, ''
'email', 'varchar(60)', 'NO', 'UNI', NULL, ''
'roles', 'longtext', 'NO', '', NULL, ''
'is_active', 'tinyint(1)', 'NO', '', NULL, ''

`Galleries`
'id', 'char(36)', 'NO', 'PRI', NULL, ''
'user_id', 'char(36)', 'NO', 'MUL', NULL, ''
'name', 'varchar(255)', 'NO', '', NULL, ''
'description', 'longtext', 'YES', '', NULL, ''
'created_at', 'datetime', 'NO', '', NULL, ''

`Images`
'id', 'char(36)', 'NO', 'PRI', NULL, ''
'gallery_id', 'char(36)', 'YES', 'MUL', NULL, ''
'original_filename', 'varchar(255)', 'NO', '', NULL, ''
'filename', 'varchar(255)', 'NO', '', NULL, ''
'description', 'longtext', 'YES', '', NULL, ''

以下查询:

SELECT gal.name, gal.description, img.filename, img.description FROM `homestead`.`users` AS users
LEFT JOIN `homestead`.`galleries` AS gal ON users.id = gal.user_id
LEFT JOIN `homestead`.`images` AS img on img.gallery_id = gal.id
WHERE img.description LIKE '%dog%';

在此查询中使用explain时,我会在“用户”查询的index字段中获得type结果。我的问题是,有没有办法改善这个查询,所以它改善了这个结果。我理解index表示它遍历该特定表格上的所有条目,在这种情况下可能是必要的。

但你们有没有看到改善这种情况的其他方法?

编辑:显示图库和图像表的索引:

画廊:

'galleries', '0', 'PRIMARY', '1', 'id', 'A', '1', NULL, NULL, '', 'BTREE', '', ''
'galleries', '0', 'UNIQ_F70E6EB7BF396750', '1', 'id', 'A', '1', NULL, NULL, '', 'BTREE', '', ''
'galleries', '1', 'IDX_F70E6EB7A76ED395', '1', 'user_id', 'A', '1', NULL, NULL, '', 'BTREE', '', ''

图片:

'images', '0', 'PRIMARY', '1', 'id', 'A', '4', NULL, NULL, '', 'BTREE', '', ''
'images', '0', 'UNIQ_E01FBE6ABF396750', '1', 'id', 'A', '4', NULL, NULL, '', 'BTREE', '', ''
'images', '1', 'IDX_E01FBE6A4E7AF8F', '1', 'gallery_id', 'A', '4', NULL, NULL, 'YES', 'BTREE', '', ''

关于查询的解释已经没有Users表:

'1', 'SIMPLE', 'gal', NULL, 'ALL', 'PRIMARY,UNIQ_F70E6EB7BF396750', NULL, NULL, NULL, '1', '100.00', NULL
'1', 'SIMPLE', 'img', NULL, 'ref', 'IDX_E01FBE6A4E7AF8F', 'IDX_E01FBE6A4E7AF8F', '109', 'homestead.gal.id', '1', '25.00', 'Using where'

1 个答案:

答案 0 :(得分:1)

(这部分不同意戈登的回答。)

由于X仅提及WHEREimages),优化工具可能会从该表开始。没有常规索引对此有用。 (戈登对WHERE i.description LIKE '%dog%'的评论是改善这种情况的“正确”方法。)

如果FULLTEXTid,则可以轻松访问第二个表格。请提供PRIMARY KEY,以便我们查看您拥有的索引。

(我同意戈登的其余答案。)

另一个问题......如果表变得“巨大”,你会发现UUID表现不佳(因为随机性)。一百万行是可以的,十亿行会非常慢。