char 和 varcha的區別
char用於表示固定長度的字符串
varchar可以保存可變長度的字符串
雖然varchar使用起來比較靈活,但是從整個系統性能角度來說,char類型的處理速度更快,有時甚至超出varchar的50%。
char長度不足時是右補空格來存儲的,
假如name char(5),則“bob”在數據的實際存儲是“bob” + 兩個空格;
set與enum的區別
都屬於枚舉類型,區別是enum僅允許一個有效數據值,而set可以是有效數據的組合。
MySQL> desc books;
+-------+----------------------+------+-----+---------+----------------+
| FIEld | Type | Null | Key | Default | Extra | | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | UNI | NULL | |
| count | smallint(5) unsigned | NO | | 0 | |
+-------+----------------------+------+-----+---------+----------------+
MySQL> alter table `books` add column `transport` set ("hk","sh") not null after count;
MySQL> desc books; | FIEld | Type | Null | Key | Default | Extra | | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | UNI | NULL | |
| count | smallint(5) unsigned | NO | | 0 | |
| transport | set('hk','sh') | NO | | NULL | | 4 rows in set (0.00 sec)
MySQL> update books set transport='hk,sh' where id = 1;
MySQL> select * from books; | id | name | count | transport | | 1 | Windows | 4 | hk,sh |
+----+---------+-------+-----------+
LIKE(not like) 和 REGEXP(not regexp)
like一般使用“_”(匹配單個字符)或“%”(匹配0個或者任意個字符)
如果需要匹配“_”或者“%”需要轉義,如“\_”,“\%”
regexp表示正則擴展模式匹配
MySQL> select * from books; | id | name | count | transport | | 1 | Windows | 4 | hk,sh |
| 2 | haha_ | 5 | hk |
MySQL> select * from books where name regexp "window[s]"; | id | name | count | transport | | 1 | Windows | 4 | hk,sh | +----+---------+-------+-----------+
匹配以“s”結尾的記錄
MySQL> select * from books where name regexp "s$"; | id | name | count | transport | | 1 | Windows | 4 | hk,sh |
+----+---------+-------+-----------+
匹配以w或者h開頭的記錄
MySQL> select * from books where name regexp "^[wh]"; | id | name | count | transport | | 1 | Windows | 4 | hk,sh |
| 2 | haha_ | 5 | hk |
+----+---------+-------+-----------+
匹配有5個字符的name的所有記錄
MySQL> select * from books where name regexp "^.{5}$"; | id | name | count | transport | | 2 | haha_ | 5 | hk |
+----+-------+-------+-----------+
text和blob
text是大小寫不敏感的blob
如果超過長度會被截斷。
blob和text指不能有default值。
權限控制
MySQL> GRANT ALL ON *.* TO root@'10.10.11.91' IDENTIFIED BY 'root' WITH GRANT OPTION;
拷貝表結構
create table to_table as select * from from_table where 1<>1;
create table to_table (id,name,num) as select id,name,num from from_table where 1<>1;
ps:從from_table將表結構拷貝到to_table。
在表頭部增加一個字段
alter table table_name add column id int(10) not null primary key auto_increment first
拷貝表內容
insert into to_table select * from from_table where 1;
insert into to_table(id,name,num) select id,name,num from from_table where 1;
清除表的query緩存
reset query cache
或者
flush tables table_name
在查詢的時候避免使用索引 -- sql_no_cache
select sql_no_cache count(*) from table;
這樣可以讓一些很少使用的語句不放在緩存裡,查找的時候不會去緩存裡找.對應的是強制緩存sql_cache
select sql_cache count(*) from table_name;
另外在my.cnf中如果設置query_cache_type=2的話,那麼只有在使用sql_cache後才會使用緩存;
假如我要count他,是用
select count(0) from table where id >0
還是用
select count(0) from table
哪個效率更高。