MySQL是一种关系型数据库,不管数据量是多还是少,都应该注意其性能问题,数据库优化主要包括结构优化和查询优化。
一、数据库结构优化
最基本的优化之一是减少数据表占用磁盘空间的大小
1)尽可能使用较小的数据类型,根据需要选择合适长度的数据类型。
2)没有特殊要求情况下,设置列为NOT NULL。
3)对每一行的识别影响不大情况下,主索引长度尽可能短
4)创建索引对查找的确有帮助,但是不要滥建索引
/*创建索引语法,可以是单列索引,也可以是多列索引*/ CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] /*可以创建一个只使用CHAR或VARCHAR列的前length字符的索引,按这种方式只索引列值的前缀可以使索引文件小得多,当索引一个BLOB或TEXT列时,你必须为索引指定前缀长度*/
二、数据库查询优化
1)多列索引
假设执行的语句如下:
mysql> SELECT * FROM tbl_name WHERE col1 = val1 AND col2 = val2;如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。
如果表有一个多列索引,优化器可以使用最左边的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。
假设(col1,col2,col3)有一个多列索引,则下面的查询语句中只有A和B使用索引,C和D没有使用索引
A: SELECT * FROM tbl_name WHERE col1=val1; B: SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; C: SELECT * FROM tbl_name WHERE col2=val2; D: SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;2)LIKE查询
如果LIKE的参数是一个不以通配符开头的常量字符串,索引也可以用于LIKE比较。下面的查询语句中只有A和B使用索引,C和D没有使用索引
A: SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; B: SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; C: SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; D: SELECT * FROM tbl_name WHERE key_col LIKE other_col;
参考资料:
[1] MySQL索引背后的数据结构及算法原理