mysql 索引遷移策略
近日在核查專案中的一些慢sql時發現乙個很雞仔兒的問題,本地開發庫表中索引跟生產上差距很大,又因為生產庫登入各種麻煩,需要各種驗證碼,那麼多的慢sql分給好些個人,不可能讓大家一人登一次資料庫,所以就有了這個索引遷移的問題,其實就是把生產的庫表的索引同步到本地庫。針對這一問題,經過查閱各種資料得出以下的解決策略。
1.索引匯出
第一步就是將生產庫中的索引導出來,這裡的匯出的索引不應該包含主鍵約束,任何一張表在建立時按照規定都是會加主鍵的,所以這裡沒有必要。以下就是匯出mysql指定資料庫除主鍵的所有索引的sql。
select
concat(
'alter table `',
table_name,
'add ',
if (
non_unique = 1,
case upper(index_type)
when 'fulltext' then
'fulltext index'
when 'spatial' then
'spatial index'
else
concat(
'index `',
index_name,
'` using ',
index_type
end,
if (
upper(index_name) = 'primary',
concat(
'primary key using ',
index_type
concat(
'unique index `',
index_name,
'` using ',
index_type
group_concat(
distinct concat('`', column_name, '`')
order by
seq_in_index asc separator ', '
) as 'all table index'
from
information_schema.statistics
where
table_schema = 'test'
and upper(index_name) != 'primary'
group by
table_name,
index_name
order by
table_name asc,
index_name asc
注意:複製sql時記得更改資料庫名 以上標紅的 test 是我本地庫。
2.索引刪除
匯出生產索引後,將指令碼儲存,接下來就要執行本地庫的索引刪除了,這裡的刪除索引也需要先構建出刪除索引的alter語句。
select
concat(
'alter table `',
table_name,
group_concat(
distinct concat(
'drop ',
if (
upper(index_name) = 'primary',
'primary key',
concat('index `', index_name, '`')
) separator ', '
from
information_schema.statistics
where
table_schema ='test'
and upper(index_name) != 'primary'
group by
table_name
order by
table_name asc
以上sql是刪除表中不包含主鍵的索引
注意資料庫的名稱一定不要搞反了。
3.索引插入
先執行第二步的得到的指令碼,再執行第一步的指令碼。
MySQL 索引策略
索引 index 是幫助mysql高效獲取資料的資料結構,這種資料結構是需要額外的寫入和儲存為代價來提高表上資料檢索的速度。一旦建立了索引後,資料庫中查詢優化器使用索引來快速定位資料,然後就無需掃瞄表中給定查詢的每一行了。索引本身也很大,不可能全部儲存在記憶體中,一般以索引檔案的形式儲存在磁碟上。當...
mysql索引設計策略 MySQL索引設計一些策略
前言 索引加快了檢索的速度,但是卻降低了資料列裡插入 刪除以及修改數值的速度。也就是說,索引降低了許多涉及寫入的操作速度。之所以出現這種情況,是由於寫入一條資料不僅僅是要寫入到資料行,還需要所有的索引都作出相應的改變如更新或是重新編排。mysql在為檢索生成乙個執行方案時候,要仔細對索引進行計算,建...
MySQL索引優化策略分析
explain的用法 執行計畫 explain select from pms product where id 1 組合索引一定是最左匹配原則 如果你在表上建立了很多組合索引,索引檔案膨脹,修改 刪除 更新會比較慢expalin的作用 type 查詢的效果從上到下越來越差 優勢 提高查詢速度 表連...