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)

表优化

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

  • 分库分表

  • 分区

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容