MYSQL基礎02
阿新 • • 發佈:2018-12-23
--索引 1.索引包含: 主鍵,唯一,普通單一,普通組合索引,全文索引,空間索引,HASH索引 2.索引建立 3.索引刪除 4.索引的使用場景和約束 mysql> desc t1 -> ; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | MUL | NULL | | | col2 | varchar(8) | YES | | NULL | | | col3 | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) --新增主鍵索引 mysql> alter table t1 add constraint pk_t1 primary key(col1); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc t1; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | PRI | NULL | | | col2 | varchar(8) | YES | | NULL | | | col3 | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> select * from t1; +------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | a | XXX | | 2 | b | XXX | | 3 | c | XXX | +------+------+------+ 3 rows in set (0.00 sec) mysql> show index from t1; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t1 | 0 | PRIMARY | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t1 | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t2 | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t2 | 2 | col3 | A | 3 | NULL | NULL | YES | BTREE | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 4 rows in set (0.00 sec) --新增唯一索引 mysql> create index unique_idx_t1 on t1(col2); Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t1; +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t1 | 0 | PRIMARY | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t1 | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t2 | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_t2 | 2 | col3 | A | 3 | NULL | NULL | YES | BTREE | | | | t1 | 1 | unique_idx_t1 | 1 | col2 | A | 3 | NULL | NULL | YES | BTREE | | | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 5 rows in set (0.01 sec) --刪除索引 mysql> drop idx_t1 on t1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'idx_t1 on t1' at line 1 mysql> drop index idx_t1 on t1; Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> drop index idx_t2 on t1; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t1; +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t1 | 0 | PRIMARY | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | unique_idx_t1 | 1 | col2 | A | 3 | NULL | NULL | YES | BTREE | | | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec) mysql> desc t1; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | PRI | NULL | | | col2 | varchar(8) | YES | MUL | NULL | | | col3 | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) --建立單索引 mysql> creaet index idx_single on t1(col3); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creaet index idx_single on t1(col3)' at line 1 mysql> create index idx_single on t1(col3); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t1; +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t1 | 0 | PRIMARY | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | unique_idx_t1 | 1 | col2 | A | 3 | NULL | NULL | YES | BTREE | | | | t1 | 1 | idx_single | 1 | col3 | A | 3 | NULL | NULL | YES | BTREE | | | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 3 rows in set (0.00 sec) --建立多列組合索引 mysql> create index idx_join on t1(col1,col3); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t1; +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t1 | 0 | PRIMARY | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | unique_idx_t1 | 1 | col2 | A | 3 | NULL | NULL | YES | BTREE | | | | t1 | 1 | idx_single | 1 | col3 | A | 3 | NULL | NULL | YES | BTREE | | | | t1 | 1 | idx_join | 1 | col1 | A | 3 | NULL | NULL | | BTREE | | | | t1 | 1 | idx_join | 2 | col3 | A | 3 | NULL | NULL | YES | BTREE | | | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 5 rows in set (0.00 sec) --新建表t2 mysql> create table t2 as select * from t1; ERROR 1050 (42S01): Table 't2' already exists mysql> drop table t2; Query OK, 0 rows affected (0.03 sec) mysql> create table t2 as select * from t1; Query OK, 3 rows affected (0.11 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | | NULL | | | col2 | varchar(8) | YES | | NULL | | | col3 | varchar(8) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) --建立全文索引 mysql> create index fulltext on t2(col2); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'fulltext on t2(col2)' at line 1 mysql> create fulltext index on t2(col2); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'on t2(col2)' at line 1 mysql> create fulltext full_idx on t2(col2); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'full_idx on t2(col2)' at line 1 mysql> show create table t2 \G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `col1` int(11) NOT NULL, `col2` varchar(8) DEFAULT NULL, `col3` varchar(8) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) --以上報錯由於全文索引只支援myisam儲存引擎引起,修改後重建 mysql> alter table t2 engine=myisam; Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show create table t2 \G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `col1` int(11) NOT NULL, `col2` varchar(8) DEFAULT NULL, `col3` varchar(8) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec) --建立全文索引 mysql> create fulltext index full_idx on t2(col2); Query OK, 3 rows affected (0.10 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show index from t2; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t2 | 1 | full_idx | 1 | col2 | NULL | NULL | NULL | NULL | YES | FULLTEXT | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec) --建立空間索引,空間索引對索引列型別要求為geometry mysql> create spatial index idx_spa on t2(col3); ERROR 1687 (42000): A SPATIAL index may only contain a geometrical type column mysql> alter table t2 add col4 geometry; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | | NULL | | | col2 | varchar(8) | YES | MUL | NULL | | | col3 | varchar(8) | YES | | NULL | | | col4 | geometry | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) --建立空間索引,同時要求表的儲存引擎為MYISAM mysql> create spatial index idx_spa on t2(col4); ERROR 1252 (42000): All parts of a SPATIAL index must be NOT NULL mysql> alter table t2 modify col4 geometry not null; Query OK, 3 rows affected, 3 warnings (0.01 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> desc t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | | NULL | | | col2 | varchar(8) | YES | MUL | NULL | | | col3 | varchar(8) | YES | | NULL | | | col4 | geometry | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) mysql> select * from t2; +------+------+------+------+ | col1 | col2 | col3 | col4 | +------+------+------+------+ | 1 | a | XXX | | | 2 | b | XXX | | | 3 | c | XXX | | +------+------+------+------+ 3 rows in set (0.00 sec) mysql> show index from t2; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t2 | 1 | full_idx | 1 | col2 | NULL | NULL | NULL | NULL | YES | FULLTEXT | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec) --由於表資料引起的建立失敗,我們先將其truncate再建,先避免失敗 mysql> create spatial index idx_spa on t2(col4); ERROR 1416 (22003): Cannot get geometry object from data you send to the GEOMETRY field mysql> truncate table t2; Query OK, 0 rows affected (0.00 sec) mysql> create spatial index idx_spa on t2(col4); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t2; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t2 | 1 | idx_spa | 1 | col4 | A | NULL | 32 | NULL | | SPATIAL | | | | t2 | 1 | full_idx | 1 | col2 | NULL | NULL | NULL | NULL | YES | FULLTEXT | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec) mysql> drop index idx_spa on t2; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> drop index full_idx on t2; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t2; Empty set (0.00 sec) mysql> create table t3 as select * from t2; ERROR 1050 (42S01): Table 't3' already exists mysql> drop table t3; Query OK, 0 rows affected (0.05 sec) --建立新表T3 mysql> create table t3 as select * from t2; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc t3; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | int(11) | NO | | NULL | | | col2 | varchar(8) | YES | | NULL | | | col3 | varchar(8) | YES | | NULL | | | col4 | geometry | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) --從以下的測試報錯也驗證了上面一點,全文索引和空間索引不能在innodb引擎上建立而要建在MYISAM引擎上 mysql> alter table t3 add fulltext index full_idx_t3 on t3(col2); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'on t3(col2)' at line 1 mysql> alter table t3 add fulltext index full_idx_t3(col2); ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes mysql> alter table t3 add spatial index spa_idx (col4); ERROR 1464 (HY000): The used table type doesn't support SPATIAL indexes mysql> alter table t3 add hash index idx_hash(col1); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index idx_hash(col1)' at line 1 mysql> --測試新表T4並修改其儲存引擎為MEMORY後建立HASH索引 mysql> show create table t4 \G; *************************** 1. row *************************** Table: t4 Create Table: CREATE TABLE `t4` ( `col1` varchar(8) DEFAULT 'xxxx', `col2` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified mysql> alter table t4 enginer=memory; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'enginer=memory' at line 1 mysql> alter table t4 engine=memory; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> show create table t4 \G *************************** 1. row *************************** Table: t4 Create Table: CREATE TABLE `t4` ( `col1` varchar(8) DEFAULT 'xxxx', `col2` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 1 row in set (0.00 sec) --注意這裡是大小寫引起錯誤 mysql> ALTER TABLE T4 ADD INDEX HASH_IDX(COL2) USING HASH; ERROR 1146 (42S02): Table 'zbk_db.T4' doesn't exist mysql> DESC T4; ERROR 1146 (42S02): Table 'zbk_db.T4' doesn't exist mysql> desc t4; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | col1 | varchar(8) | YES | | xxxx | | | col2 | int(11) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) --alter方式新增HASH索引 mysql> alter table t4 add index hash_idx(col2) using hash; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> show index from t4; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | t4 | 1 | hash_idx | 1 | col2 | NULL | 0 | NULL | NULL | YES | HASH | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.01 sec)