具有定义的一组值的TEXT列上的索引

时间:2019-01-08 01:48:56

标签: mysql sql database mysqli

mysql> describe marketing_details;
+--------------------------+---------------------+------+-----+------- 
------------+-----------------------------+
| Field                    | Type                | Null | Key | 
Default           | Extra                       |
+--------------------------+---------------------+------+-----+------- 
------------+-----------------------------+
| id                       | bigint(20)          | NO   | PRI | NULL              
| auto_increment              |
| platform_origin          | varchar(100)        | NO   | MUL |                   
|                             |
| partner_id               | bigint(20) unsigned | NO   | MUL | 0                 
|                             |
+--------------------------+---------------------+------+-----+------- 
------------+-----------------------------+

对于类似这样的查询,

SELECT * 
FROM partners
INNER JOIN marketing_details ON partners.id = marketing_details.partner_id
where marketing_details.platform_origin IN ('platform_A', 'platform_B');

platform_origin列可以具有一组定义的值(4个值之一)。因此,在此处似乎没有使用添加索引/全文本索引的功能。但是数据可能非常庞大,并且查询中可能存在多个约束。什么是优化查询的好方法?

2 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT . . .
FROM partners p INNER JOIN
     marketing_details md
     ON p.id = md.partner_id 
WHERE md.platform_origin IN ('platform_A', 'platform_B');

您应该尝试在以下位置建立索引:

  • marketing_details(platform_origin, partner_id)
  • partners(id)

如果id被声明为主键,那么您可能已经有了第二个。

答案 1 :(得分:1)

另一个建议是对platform_origin进行检查约束,使其仅具有4个可能的值

如果您的版本允许,如果在platform_origin列上具有直方图,这也将有所帮助。如果列中的值存在数据偏斜,这将为优化器提供更多输入,同时创建最佳计划。

请看以下链接。

https://mysqlserverteam.com/histogram-statistics-in-mysql/