MySQL table with more indexes than columns

时间:2015-05-12 22:28:09

标签: mysql database innodb mysql-workbench

I am working with an InnoDB MySQL database from MySQL workbench and am stuck on the indexes for one table.

I have a table

DECLARE @procname varchar(30)
SET @procname='dbo.some_root_procedure_name'
;WITH CTE([DB],[OBJ],[INDENTED_OBJ],[SCH],[lvl],[indexof_cursor],[referenced_object_definition])
AS
(
    SELECT referenced_database_name AS [DB],referenced_entity_name AS [OBJ],
    cast(space(0) + referenced_entity_name as varchar(max)) AS [INDENTED_OBJ],
    referenced_schema_name AS [SCH],0 AS [lvl]
    ,charindex('cursor',object_definition(referenced_id)) as indexof_cursor
    ,object_definition(referenced_id) as [referenced_object_definition]
    FROM sys.dm_sql_referenced_entities(@procname, 'OBJECT') 
    INNER JOIN sys.objects as o on o.object_id=OBJECT_ID(referenced_entity_name)
    WHERE o.type IN ('P','FN','IF','TF') 
UNION ALL 
    SELECT referenced_database_name AS [DB],referenced_entity_name AS [OBJ],
    cast(space(([lvl]+1)*2) + referenced_entity_name as varchar(max)) AS [INDENTED_OBJ],
    referenced_schema_name AS [SCH],[lvl]+1 as [lvl]
    ,charindex('cursor',object_definition(referenced_id)) as indexof_cursor
    ,object_definition(referenced_id) as [referenced_object_definition]
    FROM CTE as c CROSS APPLY
    sys.dm_sql_referenced_entities(c.SCH+'.'+c.OBJ, 'OBJECT') as ref
    INNER JOIN sys.objects as o on o.object_id=OBJECT_ID(referenced_entity_name)
    WHERE o.type IN ('P','FN','IF','TF') and ref.referenced_entity_name NOT IN (c.OBJ)  -- Exit Condition
) 
SELECT 
* 
FROM CTE

Since the primary key is a composite key, MySQL automatically generates a multi-column index for poll_id and voter_id. Since each foreign key must have an associated index, MySQL further generates 3 additional indexes corresponding to the 3 columns.

Now I have 4 indexes on a 3-column table, and MySQL Workbench won't let me delete any of them, even though one of them is redundant. Furthermore, I'll never need the option_id index, so that's just wasting space.

Is having more indexes than columns going to hurt me here, or should I not worry about it? Is there a better way to design this table?

EDIT: The SQL (I edited some of the field names so there's a possibility there's a typo in here):

╔═══════════════╗
║  poll_votes   ║
╟───────────────╢
║pk poll_id   fk║ //references polls.id
║pk voter_id  fk║ //references users.id
║   option_id fk║ //references poll_options.id
╚═══════════════╝

1 个答案:

答案 0 :(得分:0)

SET foreign_key_checks = OFF;
CREATE...
SET foreign_key_checks = ON;

(不,我不明白为什么那个标志正在控制你遇到的问题。)