sql学习笔记(18)-----------数据库创建过程(六)

2015-07-24 08:11:21 · 作者: · 浏览: 29
rows: 1000?
Extra: Using where?
1 row inset (0.00 sec)
而下面的sql语句就可以正确使用索引。
?
mysql> explain select * from company2 where name name=‘294'\G?
*************************** 1. row ***************************?
id: 1?
select_type: SIMPLE?
table: company2?
type: ref?
possible_keys: ind_company2_name?
key: ind_company2_name?
key_len: 23?
ref: const?
rows: 1?
Extra: Using where?
1 row inset (0.00 sec)
查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数。
?
Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。
?
mysql> show status like'Handler_read%';?
+-----------------------+-------+?
| Variable_name | Value |?
+-----------------------+-------+?
| Handler_read_first | 0 |?
| Handler_read_key | 5 |?
| Handler_read_next | 0 |?
| Handler_read_prev | 0 |?
| Handler_read_rnd | 0 |?
| Handler_read_rnd_next | 2055 |?
+-----------------------+-------+?
6 rows inset (0.00 sec)
两个简单实用的优化方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
分析表的语法如下:(检查一个或多个表是否有错误)
?
mysql> CHECK TABLE tbl_name[,tbl_name] …[option] …option =?
{ QUICK | FAST | MEDIUM| EXTENDED | CHANGED}?
mysql> check table sales;?
+--------------+-------+----------+----------+?
| Table | Op | Msg_type | Msg_text |?
+--------------+-------+----------+----------+?
| sakila.sales | check | status | OK |?
+--------------+-------+----------+----------+?
1 row inset (0.01 sec)
优化表的语法格式:
?
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name]
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM、BDB和InnoDB表起作用。
?
mysql> optimize table sales;?
+--------------+----------+----------+----------+?
| Table | Op | Msg_type | Msg_text |?
+--------------+----------+----------+----------+?
| sakila.sales | optimize | status | OK |?
+--------------+----------+----------+----------+?
1 row inset (0.05 sec)
常用SQL的优化 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
大批量插入数据
当用load命令导入数据的时候,适当设置可以提高导入的速度。
?
对于MyISAM存储引擎的表,可以通过以下方式快速的导入大量的数据。
?
ALTER TABLE tbl_name DISABLE KEYS?
loading the data?
ALTER TABLE tbl_name ENABLE KEYS
DISABLE KEYS 和ENABLE KEYS 用来打开或关闭MyISAM表非唯一索引的更新,可以提高速度,注意:对InnoDB表无效。
?
?
--没有使用打开或关闭MyISAM表非唯一索引:
mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2;?
Query OK,529056 rows affected (1 min 55.12 sec)?
Records:529056 Deleted:0 Skipped:0 Warnings:0
--使用打开或关闭MyISAM表非唯一索引:
?
mysql> alter table film_test2 disable keys;?
Query OK,0 rows affected (0.0 sec)?
mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2;?
Query OK,529056 rows affected (6.34 sec)?
Records:529056 Deleted:0 Skipped:0 Warnings:0?
mysql> alter table film_test2enable keys;?
Query OK,0 rows affected (12.25 sec)
--以上对MyISAM表的数据导入,但对于InnoDB表并不能提高导入数据的效率
?
(1)针对于InnoDB类型表数据导入的优化
?
因为InnoDB表的按照主键顺序保存的,所以将导入的数据主键的顺序排列,可以有效地提高导入数据的效率。
?
?
--使用test3.txt文本是按表film_test4主键存储顺序保存的
?
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4;?
Query OK, 1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0?
--使用test3.txt没有任何顺序的文本(效率慢了1.12倍)
?
mysql> load data infile ‘/ho