SQL基础-MySQL


SQL语句顺序 SELECT FROM WHERE GROUP BY HAVING ORDER BY

语法

-- 匹配第二个字符为t的项
SELECT ... FROM ... WHERE ... LIKE '_t%'
GRANT CREATE ON <db> TO <user>
CREATE DATABASE database_name;
DROP DATABASE database_name;
USE DATABASE database_name;
CREATE TABLE IF NOT EXITS track(
  album CHAR(10) NOT NULL,
  dsk INTEGER NOT NULL,
  -- 联合主键
  PRIMARY KEY (album, dsk)
);
DROP TABLE <name>;

-- 重命名表
ALTER TABLE table_name RENAME TO new_table_name;

-- 删除表数据信息,(相比DELETE)自增字段的初始值也会初始化
TRUNCATE TABLE table_name;

INSERT INTO t_table_0(a, b) SELECT A, B FROM t_table_1; 

-- 显示表的DDL语句
SHOW CREATE TABLE table_name;

临时表主要用于储存中间结果,当前session中断后,临时表会被自动删除。使用SHOW TABLES命令时,临时表不会被列出来。

CREATE TEMPORARY TABLE SALESSUMMARY ...
DROP TABLE SALESSUMMARY;
ALTER TABLE table_name {ADD|DROP|MODIFY} column_name {data_ype};

ALTER TABLE table_name ADD column_name <datatype> DEFAULT <defaultValue>;
ALTER TABLE table_name DROP COLUMN column_name;

-- 把x列重命名为y,类型不变
ALTER TABLE a CHANGE x y INTEGER;

-- 修改列的数据类型,并约束不可空
ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
-- 修改列的数据类型,并约束可空
ALTER TABLE table_name MODIFY column_name datatype NULL;

-- 给表的列添加唯一性约束
ALTER TABLE table_name 
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);

ALTER TABLE table_name DROP CONSTRAINT MyUniqueConstraint;

-- 给表添加主键
ALTER TABLE table_name 
ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2...);

-- 删除表的主键
ALTER TABLE t_table DROP PRIMARY KEY;
CREATE VIEW v_name AS SELECT * FROM t_table;
DROP VIEW <name>;
-- 创建a列和b列的聚合索引
CREATE INDEX i_dex ON t_table(a, b);

-- 删除索引
ALTER TABLE table_name DROP INDEX index_name;
SELECT * FROM t_table WHERE c_column IS NULL;
SELECT * FROM t_table WHERE c_column IS NOT NULL;
select * from t_test where name BETWEEN 2 AND 3;
-- 等价于
select * from t_test where name >= 2 AND name <=3;
-- 95行到结尾
SELECT * FROM table LIMIT 95,-1;
SELECT * FROM table LIMIT 5;
--前五行
SELECT * FROM table LIMIT 0,5;

性能

Type:类型,是否使用了索引还是全表扫描, const,eg_reg,ref,range,index,ALL 
Key:实际使用上的索引是哪个字段 Ken_len: 真正使用了哪些索引,不为 NULL 的就是真实使用的索引
Ref:显示了哪些字段或者常量被用来和 key 合从表中查询记录出来 
Rows:显示了MySQL认为在查询中应该检索的记录数 
Extra:显示了查询中MySQL的附加信息,关心Using filesort 和 Using temporary,性能杀手
原因:

一般都会做读写分离,其实从库压力反而比主库大/从库读写压力大非常容易导致延时。

解决方案:

1. 首先定位延时瓶颈
2. 如果是IO压力,可以通过升级硬件解决,比如替换SSD等
3. 如果IO和CPU都不是瓶颈,非常有可能是SQL单线程问题,解决方案可以考虑刚才提到的并行复制方案
4. 如果还有问题,可以考虑sharding拆分方案
SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "DB_NAME"
    AND table_name = "TABLE_NAME";