MySQL语句优化的原则,MySQL数字的进制转换

MYSQL如果使用索引(from mysql reference)

1、使用索引来更快地遍历表。

MySQL数字的进制转换(conv的使用)

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索。 大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。 字符串自动地压缩前缀和结尾空格。 总的来说,按后面的讨论使用索引。本节最后描述hash索引(用于MEMORY表)的特征。 索引用于下面的操作: ?         快速找出匹配一个WHERE子句的行。 ?         删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。 ?         当执行联接时,从其它表检索行。 ?         对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有关键字元素使用了WHERE key_part_# = constant。在这种情况下,MySQL为每个MIN()或MAX()表达式执行一次关键字查找,并用常数替换它。如果所有表达式替换为常量,查询立即返回。例如: ?                SELECT MIN(key_part2),MAX(key_part2)  FROM tbl_name WHERE key_part1=10; ?         如果对一个可用关键字的最左面的前缀进行了排序或分组(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有关键字元素后面有DESC,关键字以倒序被读取。参见7.2.12节,“MySQL如何优化ORDER BY”。 ?         在一些情况中,可以对一个查询进行优化以便不用查询数据行即可以检索值。如果查询只使用来自某个表的数字型并且构成某些关键字的最左面前缀的列,为了更快,可以从索引树检索出值。 ?                SELECT key_part3 FROM tbl_name?                    WHERE key_part1=1 假定你执行下面的SELECT语句:

  缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。

CONV(N,from_base,to_base)
在不同的数字基数之间转换数字。将数字 N 从from_base 转换到 to_base,并以字符串形式返回。如果任何一个参数为 NULL,那么返回值也为 NULL。参数 N 被解释为是一个整数,但是也可以被指定为一个整数或一个字符串。最小基为 2,最大基为 36。如果 to_base 是一个负值,N 将被看作为是一个有符号数字。否则,N 被视为是无符号的。CONV 以 64 位精度工作。

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

  合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
  a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;
  b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
  c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引
  越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。

 

如果col1和col2上存在一个多列索引,可以直接取出相应行。如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。 如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。

2、在海量查询时尽量少用格式转换。

mysql教程> select conv(100,10,2);
----------------
| conv(100,10,2) |
----------------
| 1100100        |
----------------
1 row in set (0.00 sec)

如果列不构成索引最左面的前缀,MySQL不能使用局部索引。假定有下面显示的SELECT语句: 

3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。

mysql> select conv(100,10,16);
-----------------
| conv(100,10,16) |
-----------------
| 64              |
-----------------
1 row in set (0.00 sec)

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;

**4、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

mysql>

如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。

5、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。

) CONV(N,from_base,to_base) 在不同的数字基数之间转换数字。将数字 N 从from_base 转换到 to_base,并以字符串形式返...

也可以在表达式通过=、>、>=、<、<=或者BETWEEN操作符使用B-树索引进行列比较。如果LIKE的参数是一个不以通配符开头的常量字符串,索引也可以用于LIKE比较。例如,下面的SELECT语句使用索引:

6、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

7、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。

在第1个语句中,只考虑带'Patrick' <=key_col < 'Patricl'的行。在第2个语句中,只考虑带'Pat' <=key_col < 'Pau'的行。 下面的SELECT语句不使用索引:

8、尽量少用VARCHAR、TEXT、BLOB类型

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

9、如果你的数据只有你所知的少量的几个。最好使用ENUM类型

本文由ca88手机版登录发布于亚洲城ca88手机版官网,转载请注明出处:MySQL语句优化的原则,MySQL数字的进制转换

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。