MySQL--索引

2018-08-08  本文已影响0人  薛定谔的特性

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)
REPEAT(string, count)
REPLACE(str, search_str, replace_str)
SUBSTRING(str, position[,length])
SPACE(count)

数学函数

BIN(decimal_number)
CEILING(number)
FLOOR(number)
MAX(num1, num2)
MIN(num1, num2)
SQRT(number)
RAND()

日期函数

CURDATE()
CURTIME()
NOW()
UNIX_TIMESTAMP(date)
FROM_UNIXTIME()
WEEK(date)
YEAR(date)
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语句

SHOW [SESSION|GLOBAL] STATUS;

SESSION (默认) 当前连接

GLOBAL 自数据库启动

Com_XXX表示XXX语句执行次数

Com_select  一次查询只累计加1

Com_update  执行update次数

Com_insert  批量插入只算一次

Com_delete  执行delete次数
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语句

优化GROUP BY 语句

表优化

  • 对常用列建索引
上一篇 下一篇

猜你喜欢

热点阅读