最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL定期分析檢查與優(yōu)化表的方法小結(jié)

 更新時(shí)間:2014年06月29日 13:57:24   投稿:mdxy-dxy  
聽DBA的人說(shuō),相比oracle,MySQL就是一個(gè)玩具級(jí)別的數(shù)據(jù)庫(kù),在網(wǎng)易門戶中,DBA基本很少去管理到MySQL的東西,所以我們產(chǎn)品使用到的MySQL的一些配置和優(yōu)化還是需要我們開發(fā)人員自己動(dòng)手,下面就簡(jiǎn)單介紹一下實(shí)用的定期優(yōu)化方法

定期分析表

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]

本語(yǔ)句用于分析和存儲(chǔ)表的關(guān)鍵字分布。在分析期間,使用一個(gè)讀取鎖定對(duì)表進(jìn)行鎖定。這對(duì)于MyISAM, BDB和InnoDB表有作用。對(duì)于MyISAM表,本語(yǔ)句與使用myisamchk -a相當(dāng)。

MySQL使用已存儲(chǔ)的關(guān)鍵字分布來(lái)決定,當(dāng)您對(duì)除常數(shù)以外的對(duì)象執(zhí)行聯(lián)合時(shí),表按什么順序進(jìn)行聯(lián)合。

mysql> analyze table a;
+--------+---------+----------+-----------------------------+
| Table  | Op      | Msg_type | Msg_text                    |
+--------+---------+----------+-----------------------------+
| test.a | analyze | status   | Table is already up to date |
+--------+---------+----------+-----------------------------+
1 row in set (0.00 sec)

定期檢查表

CHECK TABLE tbl_name [, tbl_name]  [option]

option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
檢查一個(gè)或多個(gè)表是否有錯(cuò)誤。CHECK TABLE對(duì)MyISAM和InnoDB表有作用。對(duì)于MyISAM表,關(guān)鍵字統(tǒng)計(jì)數(shù)據(jù)被更新。

mysql> check table a;
+--------+-------+----------+----------+
| Table  | Op    | Msg_type | Msg_text |
+--------+-------+----------+----------+
| test.a | check | status   | OK       |
+--------+-------+----------+----------+
1 row in set (0.00 sec)
CHECK TABLE也可以檢查視圖是否有錯(cuò)誤,比如在視圖定義中被引用的表已不存在。
我們?yōu)樯厦娴谋韆創(chuàng)建一個(gè)視圖

mysql> create view a_view as select * from a;
Query OK, 0 rows affected (0.02 sec)

然后CHECK一下該視圖,發(fā)現(xiàn)沒有問(wèn)題

mysql> check table a_view;
+-------------+-------+----------+----------+
| Table       | Op    | Msg_type | Msg_text |
+-------------+-------+----------+----------+
| test.a_view | check | status   | OK       |
+-------------+-------+----------+----------+
1 row in set (0.00 sec)
現(xiàn)在刪掉視圖依賴的表

mysql> drop table a;
Query OK, 0 rows affected (0.01 sec)
再CHECK一下剛才的視圖,發(fā)現(xiàn)報(bào)錯(cuò)了

mysql> check table a_view\G;
*************************** 1. row ***************************
   Table: test.a_view
      Op: check
Msg_type: Error
Msg_text: Table 'test.a' doesn't exist
*************************** 2. row ***************************
   Table: test.a_view
      Op: check
Msg_type: Error
Msg_text: View 'test.a_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
*************************** 3. row ***************************
   Table: test.a_view
      Op: check
Msg_type: error
Msg_text: Corrupt
3 rows in set (0.00 sec)

ERROR:
No query specified
定期優(yōu)化表

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]
如果您已經(jīng)刪除了表的一大部分,或者如果您已經(jīng)對(duì)含有可變長(zhǎng)度行的表(含有VARCHAR, BLOB或TEXT列的表)進(jìn)行了很多更改,則應(yīng)使用OPTIMIZE TABLE。被刪除的記錄被保持在鏈接清單中,后續(xù)的INSERT操作會(huì)重新使用舊的記錄位置。您可以使用OPTIMIZE TABLE來(lái)重新利用未使用的空間,并整理數(shù)據(jù)文件的碎片。
在多數(shù)的設(shè)置中,您根本不需要運(yùn)行OPTIMIZE TABLE。即使您對(duì)可變長(zhǎng)度的行進(jìn)行了大量的更新,您也不需要經(jīng)常運(yùn)行,每周一次或每月一次即可,只對(duì)特定的表運(yùn)行。
OPTIMIZE TABLE只對(duì)MyISAM, BDB和InnoDB表起作用。
對(duì)于MyISAM表,OPTIMIZE TABLE按如下方式操作:
如果表已經(jīng)刪除或分解了行,則修復(fù)表。
如果未對(duì)索引頁(yè)進(jìn)行分類,則進(jìn)行分類。
如果表的統(tǒng)計(jì)數(shù)據(jù)沒有更新(并且通過(guò)對(duì)索引進(jìn)行分類不能實(shí)現(xiàn)修復(fù)),則進(jìn)行更新。

mysql> OPTIMIZE table a;
+--------+----------+----------+-----------------------------+
| Table  | Op       | Msg_type | Msg_text                    |
+--------+----------+----------+-----------------------------+
| test.a | optimize | status   | Table is already up to date |
+--------+----------+----------+-----------------------------+
1 row in set (0.00 sec)

****
以上某些的段落是直接摘自MySQL的中文手冊(cè),詳細(xì)可以直接查看MySQL的幫助手冊(cè),這里只是簡(jiǎn)單指出幾種定期優(yōu)化的方式,需要注意的是無(wú)論是ANALYZE,CHECK還是OPTIMIZE在執(zhí)行期間將對(duì)表進(jìn)行鎖定,因此請(qǐng)注意這些操作要在數(shù)據(jù)庫(kù)不繁忙的時(shí)候執(zhí)行

****
參考
《MySQL 5.1參考手冊(cè)》

by 陳于喆

show table status
mysql官方文檔在

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

這里的rows行是表的行數(shù),但是實(shí)際上是不準(zhǔn)的。myisam是準(zhǔn)的,其他的存儲(chǔ)引擎是不準(zhǔn)的。要準(zhǔn)確的行數(shù)就需要使用count(*) 來(lái)獲取了。

mysql執(zhí)行大批量刪除
執(zhí)行大批量刪除的時(shí)候注意要使用上limit

因?yàn)槿绻挥胠imit,刪除大量數(shù)據(jù)很有可能造成死鎖

如果delete的where語(yǔ)句不在索引上,可以先找主鍵,然后根據(jù)主鍵刪除數(shù)據(jù)庫(kù)

ps: 平時(shí)update和delete的時(shí)候最好也加上limit 1 來(lái)防止誤操作

optimize、Analyze、check、repair維護(hù)操作

optimize 數(shù)據(jù)在插入,更新,刪除的時(shí)候難免一些數(shù)據(jù)遷移,分頁(yè),之后就出現(xiàn)一些碎片,久而久之碎片積累起來(lái)影響性能,這就需要DBA定期的優(yōu)化數(shù)據(jù)庫(kù)減少碎片,這就通過(guò)optimize命令。

如對(duì)MyisAM表操作:optimize table 表名

對(duì)于InnoDB表是不支持optimize操作,否則提示“Table does not support optimize, doing recreate + analyze instead”,當(dāng)然也可以通過(guò)命令:alter table one type=innodb; 來(lái)替代。

Analyze 用來(lái)分析和存儲(chǔ)表的關(guān)鍵字的分布,使得系統(tǒng)獲得準(zhǔn)確的統(tǒng)計(jì)信息,影響 SQL 的執(zhí)行計(jì)劃的生成。對(duì)于數(shù)據(jù)基本沒有發(fā)生變化的表,是不需要經(jīng)常進(jìn)行表分析的。但是如果表的數(shù)據(jù)量變化很明顯,用戶感覺實(shí)際的執(zhí)行計(jì)劃和預(yù)期的執(zhí)行計(jì)劃不 同的時(shí)候,執(zhí)行一次表分析可能有助于產(chǎn)生預(yù)期的執(zhí)行計(jì)劃。

Analyze table 表名

Check檢查表或者視圖是否存在錯(cuò)誤,對(duì) MyISAM 和 InnoDB 存儲(chǔ)引擎的表有作用。對(duì)于 MyISAM 存儲(chǔ)引擎的表進(jìn)行表檢查,也會(huì)同時(shí)更新關(guān)鍵字統(tǒng)計(jì)數(shù)據(jù)

Repair optimize需要有足夠的硬盤空間,否則可能會(huì)破壞表,導(dǎo)致不能操作,那就要用上repair,注意INNODB不支持repair操作
生成亂序的id
方法:

使用預(yù)設(shè)表

比如id和toid的映射

其中id是固定的,toid是隨機(jī)的。

然后在redis或memcache中記錄一個(gè)指針值,指向id

當(dāng)要獲取一個(gè)新toid的時(shí)候,取出指針值,加1,然后去預(yù)設(shè)表中獲取toid

查詢和索引
查詢的時(shí)候必須要考慮到如何命中索引

比如有幾個(gè)小招:

1 不要在索引列中使用表達(dá)式

where mycol *2 < 4

2 不要在like模式的開始位置使用通配符%

where col_name like ‘%string%'

不如

where col_name like ‘string%'

3 避免過(guò)多使用mysql自動(dòng)轉(zhuǎn)換類型,有可能無(wú)法用到index

比如

select * from mytbl where str_col=4

但是str_col為字符串,這里其實(shí)就隱含了字符串變化

應(yīng)該使用

select * from mytbl where str_col='4'

索引比表還大就不需要建立索引了嗎

索引是按照順序排列的。所以即使索引比表大,也是可以加快查詢速度的。

當(dāng)然如果索引比表還大首要的任務(wù)必須是檢查下索引建立地是否有問(wèn)題

Char和varchar如何選擇
char是定長(zhǎng),varchar變長(zhǎng)
varchar除了設(shè)置了數(shù)據(jù)之外,還多使用1兩個(gè)字節(jié)定義了數(shù)據(jù)實(shí)際長(zhǎng)度。

char會(huì)在后面空余的行填充上空字符串

myisam建議使用char。myisam中有個(gè)靜態(tài)表的概念。使用char比使用varchar的查詢效率高很多。

innodb建議使用varchar。主要是從節(jié)省空間的方面考慮

多個(gè)TimeStamp設(shè)置默認(rèn)值
一個(gè)表中至多只能有一個(gè)字段設(shè)置CURRENT_TIMESTAMP

對(duì)于下面的需求:

一個(gè)表中,有兩個(gè)字段,createtime和updatetime。

1 當(dāng)insert的時(shí)候,sql兩個(gè)字段都不設(shè)置,會(huì)設(shè)置為當(dāng)前的時(shí)間
2 當(dāng)update的時(shí)候,sql中兩個(gè)字段都不設(shè)置,updatetime會(huì)變更為當(dāng)前的時(shí)間

這樣的需求是做不到的。因?yàn)槟銦o(wú)法避免在兩個(gè)字段上設(shè)置CURRENT_TIMESTAMP 

解決辦法有幾個(gè):

1 使用觸發(fā)器。

2 將第一個(gè)timestamp的default設(shè)置為0

3 老老實(shí)實(shí)在sql語(yǔ)句中使用時(shí)間戳。

http://m.fzitv.net/article/31872.htm

查詢數(shù)據(jù)表有多少行,多少容量
不要使用select count(*)

使用show table status like ‘table_name'  但是innodb的話會(huì)有50%左右的浮動(dòng),是個(gè)預(yù)估值

AUTO_INCREMENT的設(shè)置

1 不要設(shè)置為int,請(qǐng)?jiān)O(shè)置為unsinged int,auto_increment的范圍是根據(jù)類型來(lái)判定的
2 auto_increment數(shù)據(jù)列必須要有索引,并且保證唯一性。
3 auto_increment必須有NOT NULL屬性
4 auto_increment可以使用

UPDATE table SET seq = LAST_INSERT_ID(seq -1)

mysql的表示時(shí)間的字段用什么類型
表示時(shí)間可以使用timestamp和datetime來(lái)使用

datetime表示的時(shí)間可以從0000-00-00:00:00 到9999-12-31:00:00:00

timestamp表示的時(shí)間為1970-01-01 08:00:01到2038-01-19 11:14:07

timestamp占用的空間比datetime少,且可以設(shè)置時(shí)區(qū)等功能,所以能使用timestamp的地方盡量使用timestamp

使用timestamp還可以設(shè)置

[ON UPDATE CURRENT_TIMESTAMP]

[DEFAULT CURRENT_TIMESTAMP]

myisam和innodb支持外鍵
myisam不支持外鍵,innodb支持;

如果你使用創(chuàng)建外鍵的命令對(duì)myisam的表操作,操作不會(huì)返回失敗,但是是沒有外鍵關(guān)聯(lián)建立起來(lái)的。

對(duì)一個(gè)字段加減語(yǔ)句
經(jīng)常有需求對(duì)一個(gè)字段加減會(huì)使用

update table set a = a+1

這樣是對(duì)的

但是如果這樣設(shè)置:

select a from table

取出數(shù)據(jù)后a為1

update table set a =2

這樣會(huì)導(dǎo)致如果在select和update之間有其他事務(wù)操作修改這個(gè)字段的話,導(dǎo)致最后的設(shè)置可能出錯(cuò)。

相關(guān)文章

  • mysql查詢結(jié)果實(shí)現(xiàn)多列拼接查詢

    mysql查詢結(jié)果實(shí)現(xiàn)多列拼接查詢

    本文主要介紹了mysql查詢結(jié)果實(shí)現(xiàn)多列拼接查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 關(guān)于MySql鏈接url參數(shù)的設(shè)置

    關(guān)于MySql鏈接url參數(shù)的設(shè)置

    最近整理了一下網(wǎng)上關(guān)于MySql 鏈接url 參數(shù)的設(shè)置以及常用的幾個(gè)較為重要的參數(shù),大家若感興趣可以參考下
    2014-03-03
  • 淺析CentOS6.8安裝MySQL8.0.18的教程(RPM方式)

    淺析CentOS6.8安裝MySQL8.0.18的教程(RPM方式)

    這篇文章主要介紹了CentOS6.8安裝MySQL8.0.18(RPM方式)的詳細(xì)教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • MySql5.x升級(jí)MySql8.x的方法步驟

    MySql5.x升級(jí)MySql8.x的方法步驟

    這篇文章主要介紹了MySql5.x升級(jí)MySql8.x的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Mysql錯(cuò)誤Cannot find or open table x/x from the internal問(wèn)題解決方法

    Mysql錯(cuò)誤Cannot find or open table x/x from the internal問(wèn)題解決方法

    這篇文章主要介紹了Mysql錯(cuò)誤Cannot find or open table x/x from the internal問(wèn)題解決方法,需要的朋友可以參考下
    2014-06-06
  • 查找MySQL中查詢慢的SQL語(yǔ)句方法

    查找MySQL中查詢慢的SQL語(yǔ)句方法

    這篇文章主要介紹了查找MySQL中查詢慢的SQL語(yǔ)句方法,需要的朋友可以參考下
    2017-05-05
  • MySql連接不上問(wèn)題及解決

    MySql連接不上問(wèn)題及解決

    這篇文章主要介紹了MySql連接不上問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MySQL多表查詢的具體實(shí)例

    MySQL多表查詢的具體實(shí)例

    這篇文章主要介紹了MySQL多表查詢的具體實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySql 空間索引的實(shí)現(xiàn)

    MySql 空間索引的實(shí)現(xiàn)

    MySQL空間索引是一種用于優(yōu)化地理空間數(shù)據(jù)查詢的數(shù)據(jù)結(jié)構(gòu),通過(guò)為幾何數(shù)據(jù)類型創(chuàng)建空間索引,可以高效地對(duì)空間數(shù)據(jù)進(jìn)行查詢和操作,感興趣的可以了解一下
    2024-11-11
  • MySQL初學(xué)者可以告別分組聚合查詢的困擾了

    MySQL初學(xué)者可以告別分組聚合查詢的困擾了

    這篇文章主要為大家介紹了MySQL分組聚合查詢的難點(diǎn)講解,幫助MySQL初學(xué)著告別分組聚合查詢的困擾,有需要的朋友可以借鑒參考下,希望能夠有所進(jìn)步
    2021-10-10

最新評(píng)論

仙游县| 北宁市| 邢台县| 徐闻县| 多伦县| 铁力市| 汉源县| 东乡族自治县| 临夏市| 连城县| 陆良县| 兴山县| 沈丘县| 桐乡市| 永定县| 方山县| 大荔县| 元江| 兴海县| 镇巴县| 乐平市| 兰溪市| 松原市| 册亨县| 荥经县| 内丘县| 慈利县| 伊金霍洛旗| 枣阳市| 岚皋县| 沈阳市| 临湘市| 棋牌| 石首市| 康乐县| 尚义县| 汉寿县| 合川市| 白朗县| 丰台区| 温州市|