Add index on db "allocated" columns

ml2_vxlan_allocations, ml2_gre_allocations, ml2_vlan_allocations tables
have the 'allocated' field.

There are a lot of similar queries to these tables which look
like the following:

SELECT ml2_vxlan_allocations.vxlan_vni
AS ml2_vxlan_allocations_vxlan_vni,
ml2_vxlan_allocations.allocated
AS ml2_vxlan_allocations_allocated
FROM ml2_vxlan_allocations
WHERE ml2_vxlan_allocations.allocated = 0 LIMIT 1;

Performing such selects can take quite a lot of time and if a transaction
which performs allocation is executed in parallel, it can lead to
allocation failure and retry.

Adding an index on "allocated" column significantly improves
the performance. For ml2_vlan_allocations table created
an index on (physical_network, allocation) together.

Example for MySQL for execution of query
select * from ml2_vxlan_allocations where allocated = 0;
when on the table with ~3 mln entries, ~500K of which
have allocated = 0:
+-----------------------+---------------------+
|No index on "allocated"| Index on "allocated"|
+---------------------------------------------+
|      2.02 sec         |       0.43 sec      |
+-----------------------+---------------------+

Closes-Bug: #1412348
Change-Id: Ie90ba611dcae6bd0cb7686a0c7b29b9484eae693
This commit is contained in:
Elena Ezhova 2015-01-20 19:19:43 +03:00
parent 08438a6d36
commit f72b07e5d1
5 changed files with 57 additions and 3 deletions

View File

@ -0,0 +1,50 @@
# Copyright 2015 OpenStack Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
"""Add index on allocated
Revision ID: 26b54cf9024d
Revises: 41662e32bce2
Create Date: 2015-01-20 15:49:46.100172
"""
# revision identifiers, used by Alembic.
revision = '26b54cf9024d'
down_revision = '2a1ee2fb59e0'
from alembic import op
def upgrade():
op.create_index(
op.f('ix_ml2_gre_allocations_allocated'),
'ml2_gre_allocations', ['allocated'], unique=False)
op.create_index(
op.f('ix_ml2_vxlan_allocations_allocated'),
'ml2_vxlan_allocations', ['allocated'], unique=False)
op.create_index(
op.f('ix_ml2_vlan_allocations_physical_network_allocated'),
'ml2_vlan_allocations', ['physical_network', 'allocated'],
unique=False)
def downgrade():
op.drop_index(op.f('ix_ml2_vxlan_allocations_allocated'),
table_name='ml2_vxlan_allocations')
op.drop_index(op.f('ix_ml2_gre_allocations_allocated'),
table_name='ml2_gre_allocations')
op.drop_index(op.f('ix_ml2_vlan_allocations_allocated'),
table_name='ml2_vlan_allocations')

View File

@ -1 +1 @@
2a1ee2fb59e0
26b54cf9024d

View File

@ -47,7 +47,7 @@ class GreAllocation(model_base.BASEV2):
gre_id = sa.Column(sa.Integer, nullable=False, primary_key=True,
autoincrement=False)
allocated = sa.Column(sa.Boolean, nullable=False, default=False,
server_default=sql.false())
server_default=sql.false(), index=True)
class GreEndpoints(model_base.BASEV2):

View File

@ -61,6 +61,10 @@ class VlanAllocation(model_base.BASEV2):
"""
__tablename__ = 'ml2_vlan_allocations'
__table_args__ = (
sa.Index('ix_ml2_vlan_allocations_physical_network_allocated',
'physical_network', 'allocated'),
model_base.BASEV2.__table_args__,)
physical_network = sa.Column(sa.String(64), nullable=False,
primary_key=True)

View File

@ -53,7 +53,7 @@ class VxlanAllocation(model_base.BASEV2):
vxlan_vni = sa.Column(sa.Integer, nullable=False, primary_key=True,
autoincrement=False)
allocated = sa.Column(sa.Boolean, nullable=False, default=False,
server_default=sql.false())
server_default=sql.false(), index=True)
class VxlanEndpoints(model_base.BASEV2):