MySQL SQL性能优化笔记
来源:互联网 发布:男生百搭衣服 知乎 编辑:程序博客网 时间:2024/06/08 00:07
MySQL SQL性能优化笔记
1.最近对项目优化,发现用SQL语句链接表查询,若用in,若超过40000万则死。建议用left join等连接查询。
2.关于索引优化及使用
3、优化数据库---索引:
(1)尽可能地使用最有效(最小)的数据类型。MySQL有很多节省磁盘空间和内存的专业化类型。
(2)尽可能使用较小的整数类型使表更小。例如,MEDIUMINT经常比INT好一些,因为MEDIUMINT列使用的空间要少25%。
(3)如果可能,声明列为NOT NULL。它使任何事情更快而且每列可以节省一位。注意如果在应用程序中确实需要NULL,应该毫无疑问使用它,只是避免 默认地在所有列上有它。
(4)对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式。这比较快但是不幸地可能会浪费一些空间。
(5)只创建你确实需要的索引。索引对检索有好处,但是当你需要快速存储东西时就变得糟糕。如果主要通过搜索列的组合来存取一个表,对它们做一个索引。第一个索引部分应该是最常用的列。如果从表中选择时总是使用许多列,应该首先以更多的副本使用列以获得更好的索引压缩。
(6)如果很可能一个索引在头几个字符上有唯一的前缀,仅仅索引该前缀比较好。MySQL支持对一个字符列的最左边部分创建一个索引。更短的索引会更快,不仅因为它们占较少的磁盘空间,而且因为它们将在索引缓存中提供更多的访问,因此磁盘搜索更少。
(7)创建索引:
CREATE [UNIQUE|FULLTEXT] INDEX index_name
ON tbl_name (col_name[(length)],... )
举例如下:
CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name)
);
name索引是一个对last_name和first_name的索引。索引可以用于为last_name,或者为last_name和first_name在已知范围内指定值的查询。因此,name索引用于下面的查询:
SELECT * FROM test WHERE last_name='Widenius';
SELECT * FROM test
WHERE last_name='Widenius' AND first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius'
AND (first_name='Michael' OR first_name='Monty');
SELECT * FROM test
WHERE last_name='Widenius'
AND first_name >='M' AND first_name < 'N';
然而,name索引不用于下面的查询:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
再如:
SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。
例子3:
也可以在表达式通过=、>、>=、<、<=或者BETWEEN操作符使用B-树索引进行列比较。如果LIKE的参数是一个不以通配符开头的常量字符串,索引也可以用于LIKE比较。例如,下面的SELECT语句使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
在第1个语句中,只考虑带'Patrick' <=key_col < 'Patricl'的行。在第2个语句中,只考虑带'Pat' <=key_col < 'Pau'的行。
下面的SELECT语句不使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。
如果使用... LIKE '%string%'并且string超过3个字符,MySQL使用Turbo Boyer-Moore算法初始化字符串的模式然后使用该模式来更快地进行搜索。
(8)删除索引:
DROP INDEX index_name ON tbl_name
- MySQL SQL性能优化笔记
- 【SQL】MySQL性能优化
- [笔记]MySql性能优化
- MySql优化sql语句性能
- MySQL-SQL插入性能优化
- mysql性能优化小笔记
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- MySQL 数据库性能优化之SQL优化
- Spring注解入门
- 武汉科技大学计算机学院菜鸟杯:人见人爱A+B.(杭电2033)
- strust namespace
- TI DSP的EMIF接口的地址总线问题(实际测试)
- tinyos中的signal和event
- MySQL SQL性能优化笔记
- symfony sfCaptchaGDPlugin 插件的使用方法及注意事项 sf1.4
- Ajax实现评论的顶和踩功能
- 武汉科技大学计算机学院菜鸟杯:分拆素数和.(杭电2098)
- 先安装SQL2008 R2后安装AD导致无法正常登陆数据库(无法启动MSSQLSERVER)
- Linux虚拟化: 探索 Linux 内核虚拟机 学习 KVM 架构及其优点
- 获取键盘和鼠标处于空闲状态的时间
- 数字转换大写人民币
- 去除截取对象中的html代码