Consider MySQL tables: `table1`, `table2`

`table1`:

```
+------+------+
| col1 | col2 |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+

```

`table2`:

```
+------+------+
| col1 | col2 |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+

```

What is the ***most efficient*** way to delete the rows in `table1` based on the rows in `table2` such that the desired output looks like this:

```
+------+------+
| col1 | col2 |
+------+------+
|    3 | c    |
+------+------+

```

Please note that this is a minimalist example of a problem I am having with two very large tables:

Here is code to create `table1` and `table2`:

```
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (
    col1 BIGINT,
    col2 TEXT
);
INSERT INTO table1 VALUES (1, 'a');
INSERT INTO table1 VALUES (2, 'b');
INSERT INTO table1 VALUES (3, 'c');
DROP TABLE IF EXISTS table2;
CREATE TABLE table2 (
    col1 BIGINT,
    col2 TEXT
);
INSERT INTO table2 VALUES (1, 'a');
INSERT INTO table2 VALUES (2, 'b');

```

MySQL = 5.7.12

Question:
=========

From reading this site and others I notice that there are several ways to do this operation in MySQL. I am wondering **which is the fastest way for large tables** (30M+ rows)? Here are some ways I have discovered:

1. method using `DELETE`
------------------------

```
DELETE t1
FROM table1 t1
INNER JOIN table2 t2
ON t1.col1=t2.col1;

```

2. method using `DELETE FROM`
-----------------------------

```
 DELETE FROM t1
 USING table1 t1 
 INNER JOIN table2 t2 
 ON ( t1.col1 = t2.col1 );

```

3. method using `DELETE FROM`
-----------------------------

```
 DELETE FROM table1 WHERE col1 in (SELECT col1 FROM table2);

```

Is there a faster way to do this that I have not listed here?