aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters
diff options
context:
space:
mode:
authorkennyj <kennyj@gmail.com>2011-11-19 04:11:38 +0900
committerkennyj <kennyj@gmail.com>2011-11-19 04:19:31 +0900
commitf9b917901608cda534d54b83b7d251c1fc73e31b (patch)
tree7354406da79888c6bd5ca3dfaa52f5b74ccff11a /activerecord/lib/active_record/connection_adapters
parent396ef44be48dbcbc75d313980d0ba272a6200099 (diff)
downloadrails-f9b917901608cda534d54b83b7d251c1fc73e31b.tar.gz
rails-f9b917901608cda534d54b83b7d251c1fc73e31b.tar.bz2
rails-f9b917901608cda534d54b83b7d251c1fc73e31b.zip
Use `show index from`. We could fix `pk_and_sequence_for` method's performance problem (GH #3678)
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb20
1 files changed, 2 insertions, 18 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
index 3e043992e9..f72d2974c8 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
@@ -576,24 +576,8 @@ module ActiveRecord
# Returns a table's primary key and belonging sequence.
def pk_and_sequence_for(table)
- execute_and_free("DESCRIBE #{quote_table_name(table)}", 'SCHEMA') do |result|
- keys = each_hash(result).select { |row| row[:Key] == 'PRI' }.map { |row| row[:Field] }
- keys.length == 1 ? [keys.first, nil] : nil
- end
- end
-
- def detailed_pk_and_sequence_for(table)
- sql = <<-SQL
- SELECT t.constraint_type, k.column_name
- FROM information_schema.table_constraints t
- JOIN information_schema.key_column_usage k
- USING (constraint_name, table_schema, table_name)
- WHERE t.table_schema = DATABASE()
- AND t.table_name = '#{table}'
- SQL
-
- execute_and_free(sql, 'SCHEMA') do |result|
- keys = each_hash(result).select { |row| row[:constraint_type] == 'PRIMARY KEY' }.map { |row| row[:column_name] }
+ execute_and_free("SHOW INDEX FROM #{quote_table_name(table)} WHERE Key_name = 'PRIMARY'", 'SCHEMA') do |result|
+ keys = each_hash(result).map { |row| row[:Column_name] }
keys.length == 1 ? [keys.first, nil] : nil
end
end