MySQL--索引

MySQL索引

查看索引

SHOW INDEX FROM table_name;

创建索引

ALTER TABLE table_name ADD INDEX index_name(column_list);

CREATE INDEX index_name ON table_name(column_list);

创建唯一索引

ALTER TABLE table_name ADD UNIQUE(column_list);

CREATE UNIQUE INDEX index_name ON table_name(column_list);

创建主键索引

ALTER TABLE table_name ADD PRIMARY KEY(column_list);

删除索引

ALTER TABLE table_name DROP INDEX index_name;

DROP INDEX index_name ON table_name;

删除主键

ALTER TABLE table_name DROP PRIMARY KEY;

MySQL视图

创建视图

CREATE VIEW view_name AS SELECT * FROME table_name WHERE ....;

删除视图

DROP VIEW view_name;

修改视图

ALTER VIEW view_name;

MySQL内置函数

字符串函数

  • 连接
CONCAT(string[,...])
  • 转小写
LCASE(string)
  • 转大写
UCASE(string)
  • 长度
LENGTH(string)
  • 去除左端空格
LTRIM(string)
  • 去除右端空格
RTRIM(string)
  • 重复count次
REPEAT(string, count)
  • 替换
REPLACE(str, search_str, replace_str)
  • 从position开始,截取length个字符
SUBSTRING(str, position[,length])
  • 生成count个空格
SPACE(count)

数学函数

  • 十进制转二进制
BIN(decimal_number)
  • 向上取正
CEILING(number)
  • 向下取正
FLOOR(number)
  • 取最大值
MAX(num1, num2)
  • 取最小值
MIN(num1, num2)
  • 开平方
SQRT(number)
  • 返回0-1内的随机值
RAND()

日期函数

  • 返回当前日期
CURDATE()
  • 返回当前时间
CURTIME()
  • 返回当前日期时间
NOW()
  • 返回当前date的UNIX时间戳
UNIX_TIMESTAMP(date)
  • 返回UNIX时间戳日期值
FROM_UNIXTIME()
  • 返回date为一年中的第几周
WEEK(date)
  • 返回date的年份
YEAR(date)
  • 返回expr和expr2之间的天数
DATEDIFF(expr, expr2)

MySQL预处理

  • 设置预处理
PREPARE pre_name FROM 'SELECT ... FROM table_name WHERE ?';
  • 设置变量
SET @var=value;
  • 执行预处理
EXECUTE pre_name using @var;
  • 删除预处理
DROP PREPARE pre_name;

MySQL事务处理(MyISAM引擎不支持)

  • 关闭自动提交功能
SET AUTOCOMMIT=0;
  • 创建还原点
SAVEPOINT p_name;
  • 回滚还原点
ROLLBACK TO p_name;
  • 回滚所有
ROLLBACK;

重排AUTO_INCREMENT值
清空表时用

TRUNCATE TABLE table_name;
ALTER TABLE table_name AUTO_INCREMENT=1;
  • 正则表达式
SELECT * FROM * WHERE col REGEXP "recp";
  • 提取随机行
SELECT * FROM table_name ORDER BY RAND();
  • 统计更多信息
SELECT * FROM table_name GROUP BY ... WITH ROLLUP;
  • 数值之间逻辑位运算
SELECT col0, BIT_OR(col1) FROM table_name GROUP BY col0;

SELECT col0, BIT_AND(col1) FROM table_name GROUP BY col0;

MyISAM引擎不支持外键

优化SQL语句

  • 各种SQL执行频率
SHOW [SESSION|GLOBAL] STATUS;

SESSION (默认) 当前连接

GLOBAL 自数据库启动

Com_XXX表示XXX语句执行次数

Com_select  一次查询只累计加1

Com_update  执行update次数

Com_insert  批量插入只算一次

Com_delete  执行delete次数
  • 只针对InnoDB存储引擎
Innodb_rows_read  执行select操作次数

Innodb_rows_updated  执行update操作次数

Innodb_rows_inserted  执行insert操作次数

Innodb_rows_deleted  执行delete操作次数

CONNECTIONS  连接MySQL的次数

Uptime  数据库已运行的时间(秒)

Slow_queries  慢查询的次数

+--------------------------+

定位执行效率较低的SQL语句

EXPLAIN SELECT * FROM table_name WHERE ...;
DESC SELECT * FROM table_name WHERE ...;

MySQL优化

索引优化

MyISAM独立表空间
InnoDB共享表空间

使用索引

查询条件中用到复合索引的第一列
列名是索引, 使用column_name IS NULL 将使用索引
使用LIKE的查询, 使用常量并且只有%号不在第一个字符, 索引才可能被使用
对大的文本进行搜索, 使用全文索引而不使用LIKE'%...%'

不使用索引

MySQL估计使用索引比全表扫描更慢, 则不使用索引
使用MEMORY/HEAP表并且WHERE条件中不使用'=', 则不会使用索引
用OR分割的条件中, 前面列有索引, 后面列没有索引, 则不使用索引
WHERE子句的条件中, 用到的列不是复合索引的第一列
使用LIKE的查询, 使用常量并且只有%号在第一个字符
把数值型常量赋值给一个字符串型的列, 即使字符串型的列上有索引, 也不会用到

查看索引使用情况

SHOW STATUS LIKE 'Handler_read%';

Handler_read_first 16

一行被索引值读的次数
Handler_read_key 1079
Handler_read_last 0

值越高 查询运行效率越低
Handler_read_next 152
Handler_read_prev 0
Handler_read_rnd 130
Handler_read_rnd_next 4166

  • 分析表(检查表是否有错误)
CHECK TABLE table_name[, table_name]...[option] = {QUICK|FAST|MEDIUM|EXTENDED|CHANGED}
  • 优化表
OPTIMIZE[LOCAL|NO_WRITE_TO_BINLOG] TABLE table_name[, table_name]
  • 批量导入大量数据
LOAD DATA INFILE 'file_name' INTO TABLE table_name;
  • 批量导出大量数据
SELECT ... FROM table_name INTO OUTFILE 'file_name'

提高导入效率

将导入数据按主键顺序排列

  • 关闭唯一性检验(必须保证唯一键唯一)
set unique_checks=0
  • 关闭自动提交
set autocommit=0

优化INSERT语句

  • 尽量插入多个值(减少频繁INSERT对数据库连接,关闭等的损耗)

  • 使用INSERT DELAYED(马上执行)

优化GROUP BY 语句

  • 查询包含GROUP BY但不需要排序, 使用ORDER BY NULL来禁止排序

  • 优化嵌套查询(使用JOIN)

表优化

  • 对常用列建索引
  • 数据库优化

  • 分库分表

  • 分区

你可能感兴趣的:(MySQL--索引)