天天看點

mysql那些招show table statusmysql執行大批量删除optimize、Analyze、check、repair維護操作生成亂序的id查詢和索引索引比表還大就不需要建立索引了嗎Char和varchar如何選擇多個TimeStamp設定預設值查詢資料表有多少行,多少容量AUTO_INCREMENT的設定mysql的表示時間的字段用什麼類型myisam和innodb支援外鍵對一個字段加減語句

mysql官方文檔在

<a href="http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html">http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html</a>

這裡的rows行是表的行數,但是實際上是不準的。myisam是準的,其他的存儲引擎是不準的。要準确的行數就需要使用count(*) 來擷取了。

執行大批量删除的時候注意要使用上limit

因為如果不用limit,删除大量資料很有可能造成死鎖

如果delete的where語句不在索引上,可以先找主鍵,然後根據主鍵删除資料庫

ps: 平時update和delete的時候最好也加上limit 1 來防止誤操作

l optimize 資料在插入,更新,删除的時候難免一些資料遷移,分頁,之後就出現一些碎片,久而久之碎片積累起來影響性能,這就需要dba定期的優化資料庫減少碎片,這就通過optimize指令。

如對myisam表操作:optimize table 表名

對于innodb表是不支援optimize操作,否則提示“table does not support optimize, doing recreate + analyze instead”,當然也可以通過指令:alter table one type=innodb; 來替代。

l analyze 用來分析和存儲表的關鍵字的分布,使得系統獲得準确的統計資訊,影響 sql 的執行計劃的生成。對于資料基本沒有發生變化的表,是不需要經常進行表分析的。但是如果表的資料量變化很明顯,使用者感覺實際的執行計劃和預期的執行計劃不 同的時候,執行一次表分析可能有助于産生預期的執行計劃。

analyze table 表名

l check檢查表或者視圖是否存在錯誤,對 myisam 和 innodb 存儲引擎的表有作用。對于 myisam 存儲引擎的表進行表檢查,也會同時更新關鍵字統計資料

方法:

使用預設表

比如id和toid的映射

其中id是固定的,toid是随機的。

然後在redis或memcache中記錄一個指針值,指向id

當要擷取一個新toid的時候,取出指針值,加1,然後去預設表中擷取toid

查詢的時候必須要考慮到如何命中索引

比如有幾個小招:

1 不要在索引列中使用表達式

where mycol *2 &lt; 4

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

where col_name like ‘%string%’

不如

where col_name like ‘string%’

3 避免過多使用mysql自動轉換類型,有可能無法用到index

比如

select * from mytbl where str_col=4

但是str_col為字元串,這裡其實就隐含了字元串變化

應該使用

select * from mytbl where str_col=’4’

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

當然如果索引比表還大首要的任務必須是檢查下索引建立地是否有問題

char是定長,varchar變長 

varchar除了設定了資料之外,還多使用1兩個位元組定義了資料實際長度。

char會在後面空餘的行填充上空字元串

myisam建議使用char。myisam中有個靜态表的概念。使用char比使用varchar的查詢效率高很多。

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

一個表中至多隻能有一個字段設定current_timestamp

對于下面的需求:

一個表中,有兩個字段,createtime和updatetime。

1 當insert的時候,sql兩個字段都不設定,會設定為目前的時間

2 當update的時候,sql中兩個字段都不設定,updatetime會變更為目前的時間

這樣的需求是做不到的。因為你無法避免在兩個字段上設定current_timestamp

解決辦法有幾個:

1 使用觸發器。

2 将第一個timestamp的default設定為0

3 老老實實在sql語句中使用時間戳。

<a href="http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html">http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html</a>

不要使用select count(*)

使用show table status like ‘table_name’  但是innodb的話會有50%左右的浮動,是個預估值

1 不要設定為int,請設定為unsinged int,auto_increment的範圍是根據類型來判定的

2 auto_increment資料列必須要有索引,并且保證唯一性。

3 auto_increment必須有not null屬性

4 auto_increment可以使用

update table set seq = last_insert_id(seq -1)

表示時間可以使用timestamp和datetime來使用

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

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

timestamp占用的空間比datetime少,且可以設定時區等功能,是以能使用timestamp的地方盡量使用timestamp

使用timestamp還可以設定

[on update current_timestamp]

[default current_timestamp]

myisam不支援外鍵,innodb支援;

如果你使用建立外鍵的指令對myisam的表操作,操作不會傳回失敗,但是是沒有外鍵關聯建立起來的。

經常有需求對一個字段加減會使用

update table set a = a+1

這樣是對的

但是如果這樣設定:

select a from table

取出資料後a為1

update table set a =2

這樣會導緻如果在select和update之間有其他事務操作修改這個字段的話,導緻最後的設定可能出錯。