MySQL总结
1、MySQL架构
连接层、服务层、引擎层、存储层
2、存储引擎
查看存储引擎
-- 查看支持的存储引擎
SHOW ENGINES
-- 查看默认存储引擎
SHOW VARIABLES LIKE 'storage_engine'
--查看具体某一个表所使用的存储引擎,这个默认存储引擎被修改了!
show create table tablename
--准确查看某个数据库中的某一表所使用的存储引擎
show table status like 'tablename'show table status from database where name="tablename"
设置存储引擎
-- 建表时指定存储引擎。默认的是INNODB,不需要设置
CREATE TABLE t1 (i INT) ENGINE = INNODB;
CREATE TABLE t2 (i INT) ENGINE = CSV;
CREATE TABLE t3 (i INT) ENGINE = MEMORY;
-- 修改存储引擎
ALTER TABLE t ENGINE = InnoDB;
-- 修改默认存储引擎,也可以在配置文件my.cnf中
修改默认引擎SET default_storage_engine=NDBCLUSTER;
3、数据类型
4、索引
1、创建索引
CREATE [UNIQUE] INDEX indexName ON mytable(username(length));
-- 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
ALTER table tableName ADD [UNIQUE] INDEX indexName(columnName);
-- 修改表结构 - 添加索引
2、删除索引
DROP INDEX [indexName] ON mytable;
3、查看索引
SHOW INDEX FROM table_name\G;
-- 可以通过添加 \G 来格式化输出信息。
4、修改索引
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);
-- 添加一个主键(索引值必须是唯一的,且不能为NULL)。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
-- 添加唯一值索引(可以为NULL,NULL可以出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list);
-- 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);
-- 指定索引为 FULLTEXT,用于全文索引。
索引是在存储引擎层面实现的,其本质也是一张表,所以占内存。提高了表查询速度的同时,降低了表更新的速度。
5、查询
1、count(*)、count(1)、count(列名) 的区别
a. count(*) 包括了所有的列,在统计时不忽略列值为NULL
b. count(1) 包括了所有的列,在统计时不忽略列值为NULL
c. count(列名) 只包括指定列,统计结果时会忽略列值为NULL的计数
区别:
a. 列名为主键:count(列名) 会比 count(1) 快
b. 列名非主键:count(1) 会比 count(列名) 快
c. 多列无主键:count(1) 的执行效率优于 count(*)
d. 如果有主键:select count(主键)的执行效率是最优的
e. 如果单字段:则 select count(*) 最优。
2、in 和 exists 的区别
a. exists 对外表用 loop 逐条查询
b. in 相当于多个 or 条件叠加
SELECT * FROM A WHERE A.id IN (SELECT id FROM B);
SELECT * FROM A WHERE EXISTS (SELECT * from B WHERE B.id = A.id);
如果查询的两个表大小相当,那么用 in 和 exists 差别不大。
6、SQL执行顺序
手写
SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
机读
FROM <left_table> ON <join_condition><join_type> JOIN <right_table> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> SELECTDISTINCT <select_list> ORDER BY <order_by_condition> LIMIT <limit_number>
7、JOIN图